1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-atomic-cfg-tidy=0 -verify-machineinstrs -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; This file contains tests for the AArch64 load/store optimizer. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%padding = type { i8*, i8*, i8*, i8* } 6*9880d681SAndroid Build Coastguard Worker%s.byte = type { i8, i8 } 7*9880d681SAndroid Build Coastguard Worker%s.halfword = type { i16, i16 } 8*9880d681SAndroid Build Coastguard Worker%s.word = type { i32, i32 } 9*9880d681SAndroid Build Coastguard Worker%s.doubleword = type { i64, i32 } 10*9880d681SAndroid Build Coastguard Worker%s.quadword = type { fp128, i32 } 11*9880d681SAndroid Build Coastguard Worker%s.float = type { float, i32 } 12*9880d681SAndroid Build Coastguard Worker%s.double = type { double, i32 } 13*9880d681SAndroid Build Coastguard Worker%struct.byte = type { %padding, %s.byte } 14*9880d681SAndroid Build Coastguard Worker%struct.halfword = type { %padding, %s.halfword } 15*9880d681SAndroid Build Coastguard Worker%struct.word = type { %padding, %s.word } 16*9880d681SAndroid Build Coastguard Worker%struct.doubleword = type { %padding, %s.doubleword } 17*9880d681SAndroid Build Coastguard Worker%struct.quadword = type { %padding, %s.quadword } 18*9880d681SAndroid Build Coastguard Worker%struct.float = type { %padding, %s.float } 19*9880d681SAndroid Build Coastguard Worker%struct.double = type { %padding, %s.double } 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Check the following transform: 22*9880d681SAndroid Build Coastguard Worker; 23*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x0, #32] 24*9880d681SAndroid Build Coastguard Worker; ... 25*9880d681SAndroid Build Coastguard Worker; add x0, x0, #32 26*9880d681SAndroid Build Coastguard Worker; -> 27*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x0, #32]! 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker; with X being either w1, x1, s0, d0 or q0. 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdeclare void @bar_byte(%s.byte*, i8) 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-byte(%struct.byte* %ptr) nounwind { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-byte 35*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1, i32 0 38*9880d681SAndroid Build Coastguard Worker %add = load i8, i8* %a, align 4 39*9880d681SAndroid Build Coastguard Worker br label %bar 40*9880d681SAndroid Build Coastguard Workerbar: 41*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1 42*9880d681SAndroid Build Coastguard Worker tail call void @bar_byte(%s.byte* %c, i8 %add) 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-byte(%struct.byte* %ptr, i8 %val) nounwind { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-byte 48*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1, i32 0 51*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %a, align 4 52*9880d681SAndroid Build Coastguard Worker br label %bar 53*9880d681SAndroid Build Coastguard Workerbar: 54*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1 55*9880d681SAndroid Build Coastguard Worker tail call void @bar_byte(%s.byte* %c, i8 %val) 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdeclare void @bar_halfword(%s.halfword*, i16) 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-halfword(%struct.halfword* %ptr) nounwind { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-halfword 63*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1, i32 0 66*9880d681SAndroid Build Coastguard Worker %add = load i16, i16* %a, align 4 67*9880d681SAndroid Build Coastguard Worker br label %bar 68*9880d681SAndroid Build Coastguard Workerbar: 69*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1 70*9880d681SAndroid Build Coastguard Worker tail call void @bar_halfword(%s.halfword* %c, i16 %add) 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-halfword(%struct.halfword* %ptr, i16 %val) nounwind { 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-halfword 76*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1, i32 0 79*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %a, align 4 80*9880d681SAndroid Build Coastguard Worker br label %bar 81*9880d681SAndroid Build Coastguard Workerbar: 82*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1 83*9880d681SAndroid Build Coastguard Worker tail call void @bar_halfword(%s.halfword* %c, i16 %val) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdeclare void @bar_word(%s.word*, i32) 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-word(%struct.word* %ptr) nounwind { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word 91*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0 94*9880d681SAndroid Build Coastguard Worker %add = load i32, i32* %a, align 4 95*9880d681SAndroid Build Coastguard Worker br label %bar 96*9880d681SAndroid Build Coastguard Workerbar: 97*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1 98*9880d681SAndroid Build Coastguard Worker tail call void @bar_word(%s.word* %c, i32 %add) 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word(%struct.word* %ptr, i32 %val) nounwind { 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word 104*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #32]! 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0 107*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %a, align 4 108*9880d681SAndroid Build Coastguard Worker br label %bar 109*9880d681SAndroid Build Coastguard Workerbar: 110*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1 111*9880d681SAndroid Build Coastguard Worker tail call void @bar_word(%s.word* %c, i32 %val) 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdeclare void @bar_doubleword(%s.doubleword*, i64) 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-doubleword(%struct.doubleword* %ptr) nounwind { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword 119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #32]! 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1, i32 0 122*9880d681SAndroid Build Coastguard Worker %add = load i64, i64* %a, align 4 123*9880d681SAndroid Build Coastguard Worker br label %bar 124*9880d681SAndroid Build Coastguard Workerbar: 125*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1 126*9880d681SAndroid Build Coastguard Worker tail call void @bar_doubleword(%s.doubleword* %c, i64 %add) 127*9880d681SAndroid Build Coastguard Worker ret void 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword(%struct.doubleword* %ptr, i64 %val) nounwind { 131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword 132*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #32]! 133*9880d681SAndroid Build Coastguard Workerentry: 134*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1, i32 0 135*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %a, align 4 136*9880d681SAndroid Build Coastguard Worker br label %bar 137*9880d681SAndroid Build Coastguard Workerbar: 138*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1 139*9880d681SAndroid Build Coastguard Worker tail call void @bar_doubleword(%s.doubleword* %c, i64 %val) 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare void @bar_quadword(%s.quadword*, fp128) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-quadword(%struct.quadword* %ptr) nounwind { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword 147*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #32]! 148*9880d681SAndroid Build Coastguard Workerentry: 149*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1, i32 0 150*9880d681SAndroid Build Coastguard Worker %add = load fp128, fp128* %a, align 4 151*9880d681SAndroid Build Coastguard Worker br label %bar 152*9880d681SAndroid Build Coastguard Workerbar: 153*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1 154*9880d681SAndroid Build Coastguard Worker tail call void @bar_quadword(%s.quadword* %c, fp128 %add) 155*9880d681SAndroid Build Coastguard Worker ret void 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword(%struct.quadword* %ptr, fp128 %val) nounwind { 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword 160*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #32]! 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1, i32 0 163*9880d681SAndroid Build Coastguard Worker store fp128 %val, fp128* %a, align 4 164*9880d681SAndroid Build Coastguard Worker br label %bar 165*9880d681SAndroid Build Coastguard Workerbar: 166*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1 167*9880d681SAndroid Build Coastguard Worker tail call void @bar_quadword(%s.quadword* %c, fp128 %val) 168*9880d681SAndroid Build Coastguard Worker ret void 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdeclare void @bar_float(%s.float*, float) 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-float(%struct.float* %ptr) nounwind { 174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float 175*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #32]! 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1, i32 0 178*9880d681SAndroid Build Coastguard Worker %add = load float, float* %a, align 4 179*9880d681SAndroid Build Coastguard Worker br label %bar 180*9880d681SAndroid Build Coastguard Workerbar: 181*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1 182*9880d681SAndroid Build Coastguard Worker tail call void @bar_float(%s.float* %c, float %add) 183*9880d681SAndroid Build Coastguard Worker ret void 184*9880d681SAndroid Build Coastguard Worker} 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float(%struct.float* %ptr, float %val) nounwind { 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float 188*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #32]! 189*9880d681SAndroid Build Coastguard Workerentry: 190*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1, i32 0 191*9880d681SAndroid Build Coastguard Worker store float %val, float* %a, align 4 192*9880d681SAndroid Build Coastguard Worker br label %bar 193*9880d681SAndroid Build Coastguard Workerbar: 194*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1 195*9880d681SAndroid Build Coastguard Worker tail call void @bar_float(%s.float* %c, float %val) 196*9880d681SAndroid Build Coastguard Worker ret void 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdeclare void @bar_double(%s.double*, double) 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-double(%struct.double* %ptr) nounwind { 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double 203*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #32]! 204*9880d681SAndroid Build Coastguard Workerentry: 205*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1, i32 0 206*9880d681SAndroid Build Coastguard Worker %add = load double, double* %a, align 4 207*9880d681SAndroid Build Coastguard Worker br label %bar 208*9880d681SAndroid Build Coastguard Workerbar: 209*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1 210*9880d681SAndroid Build Coastguard Worker tail call void @bar_double(%s.double* %c, double %add) 211*9880d681SAndroid Build Coastguard Worker ret void 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double(%struct.double* %ptr, double %val) nounwind { 215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double 216*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #32]! 217*9880d681SAndroid Build Coastguard Workerentry: 218*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1, i32 0 219*9880d681SAndroid Build Coastguard Worker store double %val, double* %a, align 4 220*9880d681SAndroid Build Coastguard Worker br label %bar 221*9880d681SAndroid Build Coastguard Workerbar: 222*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1 223*9880d681SAndroid Build Coastguard Worker tail call void @bar_double(%s.double* %c, double %val) 224*9880d681SAndroid Build Coastguard Worker ret void 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker; Check the following transform: 228*9880d681SAndroid Build Coastguard Worker; 229*9880d681SAndroid Build Coastguard Worker; (ldp|stp) w1, w2 [x0, #32] 230*9880d681SAndroid Build Coastguard Worker; ... 231*9880d681SAndroid Build Coastguard Worker; add x0, x0, #32 232*9880d681SAndroid Build Coastguard Worker; -> 233*9880d681SAndroid Build Coastguard Worker; (ldp|stp) w1, w2, [x0, #32]! 234*9880d681SAndroid Build Coastguard Worker; 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdefine void @load-pair-pre-indexed-word(%struct.word* %ptr) nounwind { 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pair-pre-indexed-word 238*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w{{[0-9]+}}, w{{[0-9]+}}, [x0, #32]! 239*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x0, x0, #32 240*9880d681SAndroid Build Coastguard Workerentry: 241*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0 242*9880d681SAndroid Build Coastguard Worker %a1 = load i32, i32* %a, align 4 243*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 1 244*9880d681SAndroid Build Coastguard Worker %b1 = load i32, i32* %b, align 4 245*9880d681SAndroid Build Coastguard Worker %add = add i32 %a1, %b1 246*9880d681SAndroid Build Coastguard Worker br label %bar 247*9880d681SAndroid Build Coastguard Workerbar: 248*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1 249*9880d681SAndroid Build Coastguard Worker tail call void @bar_word(%s.word* %c, i32 %add) 250*9880d681SAndroid Build Coastguard Worker ret void 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-pre-indexed-word(%struct.word* %ptr, i32 %val) nounwind { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-pre-indexed-word 255*9880d681SAndroid Build Coastguard Worker; CHECK: stp w{{[0-9]+}}, w{{[0-9]+}}, [x0, #32]! 256*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x0, x0, #32 257*9880d681SAndroid Build Coastguard Workerentry: 258*9880d681SAndroid Build Coastguard Worker %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0 259*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %a, align 4 260*9880d681SAndroid Build Coastguard Worker %b = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 1 261*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %b, align 4 262*9880d681SAndroid Build Coastguard Worker br label %bar 263*9880d681SAndroid Build Coastguard Workerbar: 264*9880d681SAndroid Build Coastguard Worker %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1 265*9880d681SAndroid Build Coastguard Worker tail call void @bar_word(%s.word* %c, i32 %val) 266*9880d681SAndroid Build Coastguard Worker ret void 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; Check the following transform: 270*9880d681SAndroid Build Coastguard Worker; 271*9880d681SAndroid Build Coastguard Worker; add x8, x8, #16 272*9880d681SAndroid Build Coastguard Worker; ... 273*9880d681SAndroid Build Coastguard Worker; ldr X, [x8] 274*9880d681SAndroid Build Coastguard Worker; -> 275*9880d681SAndroid Build Coastguard Worker; ldr X, [x8, #16]! 276*9880d681SAndroid Build Coastguard Worker; 277*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0. 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker%pre.struct.i32 = type { i32, i32, i32, i32, i32} 280*9880d681SAndroid Build Coastguard Worker%pre.struct.i64 = type { i32, i64, i64, i64, i64} 281*9880d681SAndroid Build Coastguard Worker%pre.struct.i128 = type { i32, <2 x i64>, <2 x i64>, <2 x i64>} 282*9880d681SAndroid Build Coastguard Worker%pre.struct.float = type { i32, float, float, float} 283*9880d681SAndroid Build Coastguard Worker%pre.struct.double = type { i32, double, double, double} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdefine i32 @load-pre-indexed-word2(%pre.struct.i32** %this, i1 %cond, 286*9880d681SAndroid Build Coastguard Worker %pre.struct.i32* %load2) nounwind { 287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word2 288*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #4]! 289*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 290*9880d681SAndroid Build Coastguard Workerif.then: 291*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i32*, %pre.struct.i32** %this 292*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 1 293*9880d681SAndroid Build Coastguard Worker br label %return 294*9880d681SAndroid Build Coastguard Workerif.end: 295*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 2 296*9880d681SAndroid Build Coastguard Worker br label %return 297*9880d681SAndroid Build Coastguard Workerreturn: 298*9880d681SAndroid Build Coastguard Worker %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ] 299*9880d681SAndroid Build Coastguard Worker %ret = load i32, i32* %retptr 300*9880d681SAndroid Build Coastguard Worker ret i32 %ret 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerdefine i64 @load-pre-indexed-doubleword2(%pre.struct.i64** %this, i1 %cond, 304*9880d681SAndroid Build Coastguard Worker %pre.struct.i64* %load2) nounwind { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword2 306*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #8]! 307*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 308*9880d681SAndroid Build Coastguard Workerif.then: 309*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i64*, %pre.struct.i64** %this 310*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 1 311*9880d681SAndroid Build Coastguard Worker br label %return 312*9880d681SAndroid Build Coastguard Workerif.end: 313*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 2 314*9880d681SAndroid Build Coastguard Worker br label %return 315*9880d681SAndroid Build Coastguard Workerreturn: 316*9880d681SAndroid Build Coastguard Worker %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ] 317*9880d681SAndroid Build Coastguard Worker %ret = load i64, i64* %retptr 318*9880d681SAndroid Build Coastguard Worker ret i64 %ret 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @load-pre-indexed-quadword2(%pre.struct.i128** %this, i1 %cond, 322*9880d681SAndroid Build Coastguard Worker %pre.struct.i128* %load2) nounwind { 323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword2 324*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #16]! 325*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 326*9880d681SAndroid Build Coastguard Workerif.then: 327*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i128*, %pre.struct.i128** %this 328*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 1 329*9880d681SAndroid Build Coastguard Worker br label %return 330*9880d681SAndroid Build Coastguard Workerif.end: 331*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 2 332*9880d681SAndroid Build Coastguard Worker br label %return 333*9880d681SAndroid Build Coastguard Workerreturn: 334*9880d681SAndroid Build Coastguard Worker %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ] 335*9880d681SAndroid Build Coastguard Worker %ret = load <2 x i64>, <2 x i64>* %retptr 336*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %ret 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerdefine float @load-pre-indexed-float2(%pre.struct.float** %this, i1 %cond, 340*9880d681SAndroid Build Coastguard Worker %pre.struct.float* %load2) nounwind { 341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float2 342*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #4]! 343*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 344*9880d681SAndroid Build Coastguard Workerif.then: 345*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.float*, %pre.struct.float** %this 346*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 1 347*9880d681SAndroid Build Coastguard Worker br label %return 348*9880d681SAndroid Build Coastguard Workerif.end: 349*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 2 350*9880d681SAndroid Build Coastguard Worker br label %return 351*9880d681SAndroid Build Coastguard Workerreturn: 352*9880d681SAndroid Build Coastguard Worker %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ] 353*9880d681SAndroid Build Coastguard Worker %ret = load float, float* %retptr 354*9880d681SAndroid Build Coastguard Worker ret float %ret 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerdefine double @load-pre-indexed-double2(%pre.struct.double** %this, i1 %cond, 358*9880d681SAndroid Build Coastguard Worker %pre.struct.double* %load2) nounwind { 359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double2 360*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #8]! 361*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 362*9880d681SAndroid Build Coastguard Workerif.then: 363*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.double*, %pre.struct.double** %this 364*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 1 365*9880d681SAndroid Build Coastguard Worker br label %return 366*9880d681SAndroid Build Coastguard Workerif.end: 367*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 2 368*9880d681SAndroid Build Coastguard Worker br label %return 369*9880d681SAndroid Build Coastguard Workerreturn: 370*9880d681SAndroid Build Coastguard Worker %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ] 371*9880d681SAndroid Build Coastguard Worker %ret = load double, double* %retptr 372*9880d681SAndroid Build Coastguard Worker ret double %ret 373*9880d681SAndroid Build Coastguard Worker} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerdefine i32 @load-pre-indexed-word3(%pre.struct.i32** %this, i1 %cond, 376*9880d681SAndroid Build Coastguard Worker %pre.struct.i32* %load2) nounwind { 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word3 378*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #12]! 379*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 380*9880d681SAndroid Build Coastguard Workerif.then: 381*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i32*, %pre.struct.i32** %this 382*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 3 383*9880d681SAndroid Build Coastguard Worker br label %return 384*9880d681SAndroid Build Coastguard Workerif.end: 385*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 4 386*9880d681SAndroid Build Coastguard Worker br label %return 387*9880d681SAndroid Build Coastguard Workerreturn: 388*9880d681SAndroid Build Coastguard Worker %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ] 389*9880d681SAndroid Build Coastguard Worker %ret = load i32, i32* %retptr 390*9880d681SAndroid Build Coastguard Worker ret i32 %ret 391*9880d681SAndroid Build Coastguard Worker} 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerdefine i64 @load-pre-indexed-doubleword3(%pre.struct.i64** %this, i1 %cond, 394*9880d681SAndroid Build Coastguard Worker %pre.struct.i64* %load2) nounwind { 395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword3 396*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #16]! 397*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 398*9880d681SAndroid Build Coastguard Workerif.then: 399*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i64*, %pre.struct.i64** %this 400*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 2 401*9880d681SAndroid Build Coastguard Worker br label %return 402*9880d681SAndroid Build Coastguard Workerif.end: 403*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 3 404*9880d681SAndroid Build Coastguard Worker br label %return 405*9880d681SAndroid Build Coastguard Workerreturn: 406*9880d681SAndroid Build Coastguard Worker %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ] 407*9880d681SAndroid Build Coastguard Worker %ret = load i64, i64* %retptr 408*9880d681SAndroid Build Coastguard Worker ret i64 %ret 409*9880d681SAndroid Build Coastguard Worker} 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @load-pre-indexed-quadword3(%pre.struct.i128** %this, i1 %cond, 412*9880d681SAndroid Build Coastguard Worker %pre.struct.i128* %load2) nounwind { 413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword3 414*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #32]! 415*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 416*9880d681SAndroid Build Coastguard Workerif.then: 417*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i128*, %pre.struct.i128** %this 418*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 2 419*9880d681SAndroid Build Coastguard Worker br label %return 420*9880d681SAndroid Build Coastguard Workerif.end: 421*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 3 422*9880d681SAndroid Build Coastguard Worker br label %return 423*9880d681SAndroid Build Coastguard Workerreturn: 424*9880d681SAndroid Build Coastguard Worker %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ] 425*9880d681SAndroid Build Coastguard Worker %ret = load <2 x i64>, <2 x i64>* %retptr 426*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %ret 427*9880d681SAndroid Build Coastguard Worker} 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Workerdefine float @load-pre-indexed-float3(%pre.struct.float** %this, i1 %cond, 430*9880d681SAndroid Build Coastguard Worker %pre.struct.float* %load2) nounwind { 431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float3 432*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #8]! 433*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 434*9880d681SAndroid Build Coastguard Workerif.then: 435*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.float*, %pre.struct.float** %this 436*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 2 437*9880d681SAndroid Build Coastguard Worker br label %return 438*9880d681SAndroid Build Coastguard Workerif.end: 439*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 3 440*9880d681SAndroid Build Coastguard Worker br label %return 441*9880d681SAndroid Build Coastguard Workerreturn: 442*9880d681SAndroid Build Coastguard Worker %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ] 443*9880d681SAndroid Build Coastguard Worker %ret = load float, float* %retptr 444*9880d681SAndroid Build Coastguard Worker ret float %ret 445*9880d681SAndroid Build Coastguard Worker} 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Workerdefine double @load-pre-indexed-double3(%pre.struct.double** %this, i1 %cond, 448*9880d681SAndroid Build Coastguard Worker %pre.struct.double* %load2) nounwind { 449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double3 450*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #16]! 451*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 452*9880d681SAndroid Build Coastguard Workerif.then: 453*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.double*, %pre.struct.double** %this 454*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 2 455*9880d681SAndroid Build Coastguard Worker br label %return 456*9880d681SAndroid Build Coastguard Workerif.end: 457*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 3 458*9880d681SAndroid Build Coastguard Worker br label %return 459*9880d681SAndroid Build Coastguard Workerreturn: 460*9880d681SAndroid Build Coastguard Worker %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ] 461*9880d681SAndroid Build Coastguard Worker %ret = load double, double* %retptr 462*9880d681SAndroid Build Coastguard Worker ret double %ret 463*9880d681SAndroid Build Coastguard Worker} 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker; Check the following transform: 466*9880d681SAndroid Build Coastguard Worker; 467*9880d681SAndroid Build Coastguard Worker; add x8, x8, #16 468*9880d681SAndroid Build Coastguard Worker; ... 469*9880d681SAndroid Build Coastguard Worker; str X, [x8] 470*9880d681SAndroid Build Coastguard Worker; -> 471*9880d681SAndroid Build Coastguard Worker; str X, [x8, #16]! 472*9880d681SAndroid Build Coastguard Worker; 473*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0. 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word2(%pre.struct.i32** %this, i1 %cond, 476*9880d681SAndroid Build Coastguard Worker %pre.struct.i32* %load2, 477*9880d681SAndroid Build Coastguard Worker i32 %val) nounwind { 478*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word2 479*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #4]! 480*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 481*9880d681SAndroid Build Coastguard Workerif.then: 482*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i32*, %pre.struct.i32** %this 483*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 1 484*9880d681SAndroid Build Coastguard Worker br label %return 485*9880d681SAndroid Build Coastguard Workerif.end: 486*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 2 487*9880d681SAndroid Build Coastguard Worker br label %return 488*9880d681SAndroid Build Coastguard Workerreturn: 489*9880d681SAndroid Build Coastguard Worker %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ] 490*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %retptr 491*9880d681SAndroid Build Coastguard Worker ret void 492*9880d681SAndroid Build Coastguard Worker} 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword2(%pre.struct.i64** %this, i1 %cond, 495*9880d681SAndroid Build Coastguard Worker %pre.struct.i64* %load2, 496*9880d681SAndroid Build Coastguard Worker i64 %val) nounwind { 497*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword2 498*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #8]! 499*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 500*9880d681SAndroid Build Coastguard Workerif.then: 501*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i64*, %pre.struct.i64** %this 502*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 1 503*9880d681SAndroid Build Coastguard Worker br label %return 504*9880d681SAndroid Build Coastguard Workerif.end: 505*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 2 506*9880d681SAndroid Build Coastguard Worker br label %return 507*9880d681SAndroid Build Coastguard Workerreturn: 508*9880d681SAndroid Build Coastguard Worker %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ] 509*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %retptr 510*9880d681SAndroid Build Coastguard Worker ret void 511*9880d681SAndroid Build Coastguard Worker} 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword2(%pre.struct.i128** %this, i1 %cond, 514*9880d681SAndroid Build Coastguard Worker %pre.struct.i128* %load2, 515*9880d681SAndroid Build Coastguard Worker <2 x i64> %val) nounwind { 516*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword2 517*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #16]! 518*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 519*9880d681SAndroid Build Coastguard Workerif.then: 520*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i128*, %pre.struct.i128** %this 521*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 1 522*9880d681SAndroid Build Coastguard Worker br label %return 523*9880d681SAndroid Build Coastguard Workerif.end: 524*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 2 525*9880d681SAndroid Build Coastguard Worker br label %return 526*9880d681SAndroid Build Coastguard Workerreturn: 527*9880d681SAndroid Build Coastguard Worker %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ] 528*9880d681SAndroid Build Coastguard Worker store <2 x i64> %val, <2 x i64>* %retptr 529*9880d681SAndroid Build Coastguard Worker ret void 530*9880d681SAndroid Build Coastguard Worker} 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float2(%pre.struct.float** %this, i1 %cond, 533*9880d681SAndroid Build Coastguard Worker %pre.struct.float* %load2, 534*9880d681SAndroid Build Coastguard Worker float %val) nounwind { 535*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float2 536*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #4]! 537*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 538*9880d681SAndroid Build Coastguard Workerif.then: 539*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.float*, %pre.struct.float** %this 540*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 1 541*9880d681SAndroid Build Coastguard Worker br label %return 542*9880d681SAndroid Build Coastguard Workerif.end: 543*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 2 544*9880d681SAndroid Build Coastguard Worker br label %return 545*9880d681SAndroid Build Coastguard Workerreturn: 546*9880d681SAndroid Build Coastguard Worker %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ] 547*9880d681SAndroid Build Coastguard Worker store float %val, float* %retptr 548*9880d681SAndroid Build Coastguard Worker ret void 549*9880d681SAndroid Build Coastguard Worker} 550*9880d681SAndroid Build Coastguard Worker 551*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double2(%pre.struct.double** %this, i1 %cond, 552*9880d681SAndroid Build Coastguard Worker %pre.struct.double* %load2, 553*9880d681SAndroid Build Coastguard Worker double %val) nounwind { 554*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double2 555*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #8]! 556*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 557*9880d681SAndroid Build Coastguard Workerif.then: 558*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.double*, %pre.struct.double** %this 559*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 1 560*9880d681SAndroid Build Coastguard Worker br label %return 561*9880d681SAndroid Build Coastguard Workerif.end: 562*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 2 563*9880d681SAndroid Build Coastguard Worker br label %return 564*9880d681SAndroid Build Coastguard Workerreturn: 565*9880d681SAndroid Build Coastguard Worker %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ] 566*9880d681SAndroid Build Coastguard Worker store double %val, double* %retptr 567*9880d681SAndroid Build Coastguard Worker ret void 568*9880d681SAndroid Build Coastguard Worker} 569*9880d681SAndroid Build Coastguard Worker 570*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word3(%pre.struct.i32** %this, i1 %cond, 571*9880d681SAndroid Build Coastguard Worker %pre.struct.i32* %load2, 572*9880d681SAndroid Build Coastguard Worker i32 %val) nounwind { 573*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word3 574*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #12]! 575*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 576*9880d681SAndroid Build Coastguard Workerif.then: 577*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i32*, %pre.struct.i32** %this 578*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 3 579*9880d681SAndroid Build Coastguard Worker br label %return 580*9880d681SAndroid Build Coastguard Workerif.end: 581*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 4 582*9880d681SAndroid Build Coastguard Worker br label %return 583*9880d681SAndroid Build Coastguard Workerreturn: 584*9880d681SAndroid Build Coastguard Worker %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ] 585*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %retptr 586*9880d681SAndroid Build Coastguard Worker ret void 587*9880d681SAndroid Build Coastguard Worker} 588*9880d681SAndroid Build Coastguard Worker 589*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword3(%pre.struct.i64** %this, i1 %cond, 590*9880d681SAndroid Build Coastguard Worker %pre.struct.i64* %load2, 591*9880d681SAndroid Build Coastguard Worker i64 %val) nounwind { 592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword3 593*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #24]! 594*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 595*9880d681SAndroid Build Coastguard Workerif.then: 596*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i64*, %pre.struct.i64** %this 597*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 3 598*9880d681SAndroid Build Coastguard Worker br label %return 599*9880d681SAndroid Build Coastguard Workerif.end: 600*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 4 601*9880d681SAndroid Build Coastguard Worker br label %return 602*9880d681SAndroid Build Coastguard Workerreturn: 603*9880d681SAndroid Build Coastguard Worker %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ] 604*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %retptr 605*9880d681SAndroid Build Coastguard Worker ret void 606*9880d681SAndroid Build Coastguard Worker} 607*9880d681SAndroid Build Coastguard Worker 608*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword3(%pre.struct.i128** %this, i1 %cond, 609*9880d681SAndroid Build Coastguard Worker %pre.struct.i128* %load2, 610*9880d681SAndroid Build Coastguard Worker <2 x i64> %val) nounwind { 611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword3 612*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #32]! 613*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 614*9880d681SAndroid Build Coastguard Workerif.then: 615*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.i128*, %pre.struct.i128** %this 616*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 2 617*9880d681SAndroid Build Coastguard Worker br label %return 618*9880d681SAndroid Build Coastguard Workerif.end: 619*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 3 620*9880d681SAndroid Build Coastguard Worker br label %return 621*9880d681SAndroid Build Coastguard Workerreturn: 622*9880d681SAndroid Build Coastguard Worker %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ] 623*9880d681SAndroid Build Coastguard Worker store <2 x i64> %val, <2 x i64>* %retptr 624*9880d681SAndroid Build Coastguard Worker ret void 625*9880d681SAndroid Build Coastguard Worker} 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float3(%pre.struct.float** %this, i1 %cond, 628*9880d681SAndroid Build Coastguard Worker %pre.struct.float* %load2, 629*9880d681SAndroid Build Coastguard Worker float %val) nounwind { 630*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float3 631*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #8]! 632*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 633*9880d681SAndroid Build Coastguard Workerif.then: 634*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.float*, %pre.struct.float** %this 635*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 2 636*9880d681SAndroid Build Coastguard Worker br label %return 637*9880d681SAndroid Build Coastguard Workerif.end: 638*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 3 639*9880d681SAndroid Build Coastguard Worker br label %return 640*9880d681SAndroid Build Coastguard Workerreturn: 641*9880d681SAndroid Build Coastguard Worker %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ] 642*9880d681SAndroid Build Coastguard Worker store float %val, float* %retptr 643*9880d681SAndroid Build Coastguard Worker ret void 644*9880d681SAndroid Build Coastguard Worker} 645*9880d681SAndroid Build Coastguard Worker 646*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double3(%pre.struct.double** %this, i1 %cond, 647*9880d681SAndroid Build Coastguard Worker %pre.struct.double* %load2, 648*9880d681SAndroid Build Coastguard Worker double %val) nounwind { 649*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double3 650*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #16]! 651*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %if.end 652*9880d681SAndroid Build Coastguard Workerif.then: 653*9880d681SAndroid Build Coastguard Worker %load1 = load %pre.struct.double*, %pre.struct.double** %this 654*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 2 655*9880d681SAndroid Build Coastguard Worker br label %return 656*9880d681SAndroid Build Coastguard Workerif.end: 657*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 3 658*9880d681SAndroid Build Coastguard Worker br label %return 659*9880d681SAndroid Build Coastguard Workerreturn: 660*9880d681SAndroid Build Coastguard Worker %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ] 661*9880d681SAndroid Build Coastguard Worker store double %val, double* %retptr 662*9880d681SAndroid Build Coastguard Worker ret void 663*9880d681SAndroid Build Coastguard Worker} 664*9880d681SAndroid Build Coastguard Worker 665*9880d681SAndroid Build Coastguard Worker; Check the following transform: 666*9880d681SAndroid Build Coastguard Worker; 667*9880d681SAndroid Build Coastguard Worker; ldr X, [x20] 668*9880d681SAndroid Build Coastguard Worker; ... 669*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32 670*9880d681SAndroid Build Coastguard Worker; -> 671*9880d681SAndroid Build Coastguard Worker; ldr X, [x20], #32 672*9880d681SAndroid Build Coastguard Worker; 673*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0. 674*9880d681SAndroid Build Coastguard Worker 675*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-byte(i8* %array, i64 %count) nounwind { 676*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-byte 677*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w{{[0-9]+}}, [x{{[0-9]+}}], #4 678*9880d681SAndroid Build Coastguard Workerentry: 679*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i8, i8* %array, i64 2 680*9880d681SAndroid Build Coastguard Worker br label %body 681*9880d681SAndroid Build Coastguard Worker 682*9880d681SAndroid Build Coastguard Workerbody: 683*9880d681SAndroid Build Coastguard Worker %iv2 = phi i8* [ %gep3, %body ], [ %gep1, %entry ] 684*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 685*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i8, i8* %iv2, i64 -1 686*9880d681SAndroid Build Coastguard Worker %load = load i8, i8* %gep2 687*9880d681SAndroid Build Coastguard Worker call void @use-byte(i8 %load) 688*9880d681SAndroid Build Coastguard Worker %load2 = load i8, i8* %iv2 689*9880d681SAndroid Build Coastguard Worker call void @use-byte(i8 %load2) 690*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 691*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i8, i8* %iv2, i64 4 692*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 693*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 694*9880d681SAndroid Build Coastguard Worker 695*9880d681SAndroid Build Coastguard Workerexit: 696*9880d681SAndroid Build Coastguard Worker ret void 697*9880d681SAndroid Build Coastguard Worker} 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-halfword(i16* %array, i64 %count) nounwind { 700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-halfword 701*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w{{[0-9]+}}, [x{{[0-9]+}}], #8 702*9880d681SAndroid Build Coastguard Workerentry: 703*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i16, i16* %array, i64 2 704*9880d681SAndroid Build Coastguard Worker br label %body 705*9880d681SAndroid Build Coastguard Worker 706*9880d681SAndroid Build Coastguard Workerbody: 707*9880d681SAndroid Build Coastguard Worker %iv2 = phi i16* [ %gep3, %body ], [ %gep1, %entry ] 708*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 709*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i16, i16* %iv2, i64 -1 710*9880d681SAndroid Build Coastguard Worker %load = load i16, i16* %gep2 711*9880d681SAndroid Build Coastguard Worker call void @use-halfword(i16 %load) 712*9880d681SAndroid Build Coastguard Worker %load2 = load i16, i16* %iv2 713*9880d681SAndroid Build Coastguard Worker call void @use-halfword(i16 %load2) 714*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 715*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i16, i16* %iv2, i64 4 716*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 717*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 718*9880d681SAndroid Build Coastguard Worker 719*9880d681SAndroid Build Coastguard Workerexit: 720*9880d681SAndroid Build Coastguard Worker ret void 721*9880d681SAndroid Build Coastguard Worker} 722*9880d681SAndroid Build Coastguard Worker 723*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-word(i32* %array, i64 %count) nounwind { 724*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-word 725*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}], #16 726*9880d681SAndroid Build Coastguard Workerentry: 727*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i32, i32* %array, i64 2 728*9880d681SAndroid Build Coastguard Worker br label %body 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Workerbody: 731*9880d681SAndroid Build Coastguard Worker %iv2 = phi i32* [ %gep3, %body ], [ %gep1, %entry ] 732*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 733*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i32, i32* %iv2, i64 -1 734*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %gep2 735*9880d681SAndroid Build Coastguard Worker call void @use-word(i32 %load) 736*9880d681SAndroid Build Coastguard Worker %load2 = load i32, i32* %iv2 737*9880d681SAndroid Build Coastguard Worker call void @use-word(i32 %load2) 738*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 739*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i32, i32* %iv2, i64 4 740*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 741*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 742*9880d681SAndroid Build Coastguard Worker 743*9880d681SAndroid Build Coastguard Workerexit: 744*9880d681SAndroid Build Coastguard Worker ret void 745*9880d681SAndroid Build Coastguard Worker} 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-doubleword(i64* %array, i64 %count) nounwind { 748*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-doubleword 749*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}], #32 750*9880d681SAndroid Build Coastguard Workerentry: 751*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i64, i64* %array, i64 2 752*9880d681SAndroid Build Coastguard Worker br label %body 753*9880d681SAndroid Build Coastguard Worker 754*9880d681SAndroid Build Coastguard Workerbody: 755*9880d681SAndroid Build Coastguard Worker %iv2 = phi i64* [ %gep3, %body ], [ %gep1, %entry ] 756*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 757*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i64, i64* %iv2, i64 -1 758*9880d681SAndroid Build Coastguard Worker %load = load i64, i64* %gep2 759*9880d681SAndroid Build Coastguard Worker call void @use-doubleword(i64 %load) 760*9880d681SAndroid Build Coastguard Worker %load2 = load i64, i64* %iv2 761*9880d681SAndroid Build Coastguard Worker call void @use-doubleword(i64 %load2) 762*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 763*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i64, i64* %iv2, i64 4 764*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 765*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 766*9880d681SAndroid Build Coastguard Worker 767*9880d681SAndroid Build Coastguard Workerexit: 768*9880d681SAndroid Build Coastguard Worker ret void 769*9880d681SAndroid Build Coastguard Worker} 770*9880d681SAndroid Build Coastguard Worker 771*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-quadword(<2 x i64>* %array, i64 %count) nounwind { 772*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-quadword 773*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}], #64 774*9880d681SAndroid Build Coastguard Workerentry: 775*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr <2 x i64>, <2 x i64>* %array, i64 2 776*9880d681SAndroid Build Coastguard Worker br label %body 777*9880d681SAndroid Build Coastguard Worker 778*9880d681SAndroid Build Coastguard Workerbody: 779*9880d681SAndroid Build Coastguard Worker %iv2 = phi <2 x i64>* [ %gep3, %body ], [ %gep1, %entry ] 780*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 781*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 -1 782*9880d681SAndroid Build Coastguard Worker %load = load <2 x i64>, <2 x i64>* %gep2 783*9880d681SAndroid Build Coastguard Worker call void @use-quadword(<2 x i64> %load) 784*9880d681SAndroid Build Coastguard Worker %load2 = load <2 x i64>, <2 x i64>* %iv2 785*9880d681SAndroid Build Coastguard Worker call void @use-quadword(<2 x i64> %load2) 786*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 787*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 4 788*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 789*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 790*9880d681SAndroid Build Coastguard Worker 791*9880d681SAndroid Build Coastguard Workerexit: 792*9880d681SAndroid Build Coastguard Worker ret void 793*9880d681SAndroid Build Coastguard Worker} 794*9880d681SAndroid Build Coastguard Worker 795*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-float(float* %array, i64 %count) nounwind { 796*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-float 797*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}], #16 798*9880d681SAndroid Build Coastguard Workerentry: 799*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr float, float* %array, i64 2 800*9880d681SAndroid Build Coastguard Worker br label %body 801*9880d681SAndroid Build Coastguard Worker 802*9880d681SAndroid Build Coastguard Workerbody: 803*9880d681SAndroid Build Coastguard Worker %iv2 = phi float* [ %gep3, %body ], [ %gep1, %entry ] 804*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 805*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr float, float* %iv2, i64 -1 806*9880d681SAndroid Build Coastguard Worker %load = load float, float* %gep2 807*9880d681SAndroid Build Coastguard Worker call void @use-float(float %load) 808*9880d681SAndroid Build Coastguard Worker %load2 = load float, float* %iv2 809*9880d681SAndroid Build Coastguard Worker call void @use-float(float %load2) 810*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 811*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr float, float* %iv2, i64 4 812*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 813*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 814*9880d681SAndroid Build Coastguard Worker 815*9880d681SAndroid Build Coastguard Workerexit: 816*9880d681SAndroid Build Coastguard Worker ret void 817*9880d681SAndroid Build Coastguard Worker} 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-double(double* %array, i64 %count) nounwind { 820*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-double 821*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}], #32 822*9880d681SAndroid Build Coastguard Workerentry: 823*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr double, double* %array, i64 2 824*9880d681SAndroid Build Coastguard Worker br label %body 825*9880d681SAndroid Build Coastguard Worker 826*9880d681SAndroid Build Coastguard Workerbody: 827*9880d681SAndroid Build Coastguard Worker %iv2 = phi double* [ %gep3, %body ], [ %gep1, %entry ] 828*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 829*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr double, double* %iv2, i64 -1 830*9880d681SAndroid Build Coastguard Worker %load = load double, double* %gep2 831*9880d681SAndroid Build Coastguard Worker call void @use-double(double %load) 832*9880d681SAndroid Build Coastguard Worker %load2 = load double, double* %iv2 833*9880d681SAndroid Build Coastguard Worker call void @use-double(double %load2) 834*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 835*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr double, double* %iv2, i64 4 836*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 837*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 838*9880d681SAndroid Build Coastguard Worker 839*9880d681SAndroid Build Coastguard Workerexit: 840*9880d681SAndroid Build Coastguard Worker ret void 841*9880d681SAndroid Build Coastguard Worker} 842*9880d681SAndroid Build Coastguard Worker 843*9880d681SAndroid Build Coastguard Worker; Check the following transform: 844*9880d681SAndroid Build Coastguard Worker; 845*9880d681SAndroid Build Coastguard Worker; str X, [x20] 846*9880d681SAndroid Build Coastguard Worker; ... 847*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32 848*9880d681SAndroid Build Coastguard Worker; -> 849*9880d681SAndroid Build Coastguard Worker; str X, [x20], #32 850*9880d681SAndroid Build Coastguard Worker; 851*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0. 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-byte(i8* %array, i64 %count, i8 %val) nounwind { 854*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-byte 855*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9]+}}, [x{{[0-9]+}}], #4 856*9880d681SAndroid Build Coastguard Workerentry: 857*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i8, i8* %array, i64 2 858*9880d681SAndroid Build Coastguard Worker br label %body 859*9880d681SAndroid Build Coastguard Worker 860*9880d681SAndroid Build Coastguard Workerbody: 861*9880d681SAndroid Build Coastguard Worker %iv2 = phi i8* [ %gep3, %body ], [ %gep1, %entry ] 862*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 863*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i8, i8* %iv2, i64 -1 864*9880d681SAndroid Build Coastguard Worker %load = load i8, i8* %gep2 865*9880d681SAndroid Build Coastguard Worker call void @use-byte(i8 %load) 866*9880d681SAndroid Build Coastguard Worker store i8 %val, i8* %iv2 867*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 868*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i8, i8* %iv2, i64 4 869*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 870*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 871*9880d681SAndroid Build Coastguard Worker 872*9880d681SAndroid Build Coastguard Workerexit: 873*9880d681SAndroid Build Coastguard Worker ret void 874*9880d681SAndroid Build Coastguard Worker} 875*9880d681SAndroid Build Coastguard Worker 876*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-halfword(i16* %array, i64 %count, i16 %val) nounwind { 877*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-halfword 878*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9]+}}, [x{{[0-9]+}}], #8 879*9880d681SAndroid Build Coastguard Workerentry: 880*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i16, i16* %array, i64 2 881*9880d681SAndroid Build Coastguard Worker br label %body 882*9880d681SAndroid Build Coastguard Worker 883*9880d681SAndroid Build Coastguard Workerbody: 884*9880d681SAndroid Build Coastguard Worker %iv2 = phi i16* [ %gep3, %body ], [ %gep1, %entry ] 885*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 886*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i16, i16* %iv2, i64 -1 887*9880d681SAndroid Build Coastguard Worker %load = load i16, i16* %gep2 888*9880d681SAndroid Build Coastguard Worker call void @use-halfword(i16 %load) 889*9880d681SAndroid Build Coastguard Worker store i16 %val, i16* %iv2 890*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 891*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i16, i16* %iv2, i64 4 892*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 893*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 894*9880d681SAndroid Build Coastguard Worker 895*9880d681SAndroid Build Coastguard Workerexit: 896*9880d681SAndroid Build Coastguard Worker ret void 897*9880d681SAndroid Build Coastguard Worker} 898*9880d681SAndroid Build Coastguard Worker 899*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-word(i32* %array, i64 %count, i32 %val) nounwind { 900*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-word 901*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}], #16 902*9880d681SAndroid Build Coastguard Workerentry: 903*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i32, i32* %array, i64 2 904*9880d681SAndroid Build Coastguard Worker br label %body 905*9880d681SAndroid Build Coastguard Worker 906*9880d681SAndroid Build Coastguard Workerbody: 907*9880d681SAndroid Build Coastguard Worker %iv2 = phi i32* [ %gep3, %body ], [ %gep1, %entry ] 908*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 909*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i32, i32* %iv2, i64 -1 910*9880d681SAndroid Build Coastguard Worker %load = load i32, i32* %gep2 911*9880d681SAndroid Build Coastguard Worker call void @use-word(i32 %load) 912*9880d681SAndroid Build Coastguard Worker store i32 %val, i32* %iv2 913*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 914*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i32, i32* %iv2, i64 4 915*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 916*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 917*9880d681SAndroid Build Coastguard Worker 918*9880d681SAndroid Build Coastguard Workerexit: 919*9880d681SAndroid Build Coastguard Worker ret void 920*9880d681SAndroid Build Coastguard Worker} 921*9880d681SAndroid Build Coastguard Worker 922*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-doubleword(i64* %array, i64 %count, i64 %val) nounwind { 923*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-doubleword 924*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}], #32 925*9880d681SAndroid Build Coastguard Workerentry: 926*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i64, i64* %array, i64 2 927*9880d681SAndroid Build Coastguard Worker br label %body 928*9880d681SAndroid Build Coastguard Worker 929*9880d681SAndroid Build Coastguard Workerbody: 930*9880d681SAndroid Build Coastguard Worker %iv2 = phi i64* [ %gep3, %body ], [ %gep1, %entry ] 931*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 932*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i64, i64* %iv2, i64 -1 933*9880d681SAndroid Build Coastguard Worker %load = load i64, i64* %gep2 934*9880d681SAndroid Build Coastguard Worker call void @use-doubleword(i64 %load) 935*9880d681SAndroid Build Coastguard Worker store i64 %val, i64* %iv2 936*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 937*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i64, i64* %iv2, i64 4 938*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 939*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 940*9880d681SAndroid Build Coastguard Worker 941*9880d681SAndroid Build Coastguard Workerexit: 942*9880d681SAndroid Build Coastguard Worker ret void 943*9880d681SAndroid Build Coastguard Worker} 944*9880d681SAndroid Build Coastguard Worker 945*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-quadword(<2 x i64>* %array, i64 %count, <2 x i64> %val) nounwind { 946*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-quadword 947*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}], #64 948*9880d681SAndroid Build Coastguard Workerentry: 949*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr <2 x i64>, <2 x i64>* %array, i64 2 950*9880d681SAndroid Build Coastguard Worker br label %body 951*9880d681SAndroid Build Coastguard Worker 952*9880d681SAndroid Build Coastguard Workerbody: 953*9880d681SAndroid Build Coastguard Worker %iv2 = phi <2 x i64>* [ %gep3, %body ], [ %gep1, %entry ] 954*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 955*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 -1 956*9880d681SAndroid Build Coastguard Worker %load = load <2 x i64>, <2 x i64>* %gep2 957*9880d681SAndroid Build Coastguard Worker call void @use-quadword(<2 x i64> %load) 958*9880d681SAndroid Build Coastguard Worker store <2 x i64> %val, <2 x i64>* %iv2 959*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 960*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 4 961*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 962*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 963*9880d681SAndroid Build Coastguard Worker 964*9880d681SAndroid Build Coastguard Workerexit: 965*9880d681SAndroid Build Coastguard Worker ret void 966*9880d681SAndroid Build Coastguard Worker} 967*9880d681SAndroid Build Coastguard Worker 968*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-float(float* %array, i64 %count, float %val) nounwind { 969*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-float 970*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}], #16 971*9880d681SAndroid Build Coastguard Workerentry: 972*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr float, float* %array, i64 2 973*9880d681SAndroid Build Coastguard Worker br label %body 974*9880d681SAndroid Build Coastguard Worker 975*9880d681SAndroid Build Coastguard Workerbody: 976*9880d681SAndroid Build Coastguard Worker %iv2 = phi float* [ %gep3, %body ], [ %gep1, %entry ] 977*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 978*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr float, float* %iv2, i64 -1 979*9880d681SAndroid Build Coastguard Worker %load = load float, float* %gep2 980*9880d681SAndroid Build Coastguard Worker call void @use-float(float %load) 981*9880d681SAndroid Build Coastguard Worker store float %val, float* %iv2 982*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 983*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr float, float* %iv2, i64 4 984*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 985*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 986*9880d681SAndroid Build Coastguard Worker 987*9880d681SAndroid Build Coastguard Workerexit: 988*9880d681SAndroid Build Coastguard Worker ret void 989*9880d681SAndroid Build Coastguard Worker} 990*9880d681SAndroid Build Coastguard Worker 991*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-double(double* %array, i64 %count, double %val) nounwind { 992*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-double 993*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}], #32 994*9880d681SAndroid Build Coastguard Workerentry: 995*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr double, double* %array, i64 2 996*9880d681SAndroid Build Coastguard Worker br label %body 997*9880d681SAndroid Build Coastguard Worker 998*9880d681SAndroid Build Coastguard Workerbody: 999*9880d681SAndroid Build Coastguard Worker %iv2 = phi double* [ %gep3, %body ], [ %gep1, %entry ] 1000*9880d681SAndroid Build Coastguard Worker %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ] 1001*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr double, double* %iv2, i64 -1 1002*9880d681SAndroid Build Coastguard Worker %load = load double, double* %gep2 1003*9880d681SAndroid Build Coastguard Worker call void @use-double(double %load) 1004*9880d681SAndroid Build Coastguard Worker store double %val, double* %iv2 1005*9880d681SAndroid Build Coastguard Worker %iv.next = add i64 %iv, -4 1006*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr double, double* %iv2, i64 4 1007*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %iv.next, 0 1008*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %exit, label %body 1009*9880d681SAndroid Build Coastguard Worker 1010*9880d681SAndroid Build Coastguard Workerexit: 1011*9880d681SAndroid Build Coastguard Worker ret void 1012*9880d681SAndroid Build Coastguard Worker} 1013*9880d681SAndroid Build Coastguard Worker 1014*9880d681SAndroid Build Coastguard Workerdeclare void @use-byte(i8) 1015*9880d681SAndroid Build Coastguard Workerdeclare void @use-halfword(i16) 1016*9880d681SAndroid Build Coastguard Workerdeclare void @use-word(i32) 1017*9880d681SAndroid Build Coastguard Workerdeclare void @use-doubleword(i64) 1018*9880d681SAndroid Build Coastguard Workerdeclare void @use-quadword(<2 x i64>) 1019*9880d681SAndroid Build Coastguard Workerdeclare void @use-float(float) 1020*9880d681SAndroid Build Coastguard Workerdeclare void @use-double(double) 1021*9880d681SAndroid Build Coastguard Worker 1022*9880d681SAndroid Build Coastguard Worker; Check the following transform: 1023*9880d681SAndroid Build Coastguard Worker; 1024*9880d681SAndroid Build Coastguard Worker; stp w0, [x20] 1025*9880d681SAndroid Build Coastguard Worker; ... 1026*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32 1027*9880d681SAndroid Build Coastguard Worker; -> 1028*9880d681SAndroid Build Coastguard Worker; stp w0, [x20], #32 1029*9880d681SAndroid Build Coastguard Worker 1030*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-word() nounwind { 1031*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-word 1032*9880d681SAndroid Build Coastguard Worker; CHECK: stp w{{[0-9]+}}, w{{[0-9]+}}, [sp], #16 1033*9880d681SAndroid Build Coastguard Worker; CHECK: ret 1034*9880d681SAndroid Build Coastguard Worker %src = alloca { i32, i32 }, align 8 1035*9880d681SAndroid Build Coastguard Worker %dst = alloca { i32, i32 }, align 8 1036*9880d681SAndroid Build Coastguard Worker 1037*9880d681SAndroid Build Coastguard Worker %src.realp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %src, i32 0, i32 0 1038*9880d681SAndroid Build Coastguard Worker %src.real = load i32, i32* %src.realp 1039*9880d681SAndroid Build Coastguard Worker %src.imagp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %src, i32 0, i32 1 1040*9880d681SAndroid Build Coastguard Worker %src.imag = load i32, i32* %src.imagp 1041*9880d681SAndroid Build Coastguard Worker 1042*9880d681SAndroid Build Coastguard Worker %dst.realp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %dst, i32 0, i32 0 1043*9880d681SAndroid Build Coastguard Worker %dst.imagp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %dst, i32 0, i32 1 1044*9880d681SAndroid Build Coastguard Worker store i32 %src.real, i32* %dst.realp 1045*9880d681SAndroid Build Coastguard Worker store i32 %src.imag, i32* %dst.imagp 1046*9880d681SAndroid Build Coastguard Worker ret void 1047*9880d681SAndroid Build Coastguard Worker} 1048*9880d681SAndroid Build Coastguard Worker 1049*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-doubleword() nounwind { 1050*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-doubleword 1051*9880d681SAndroid Build Coastguard Worker; CHECK: stp x{{[0-9]+}}, x{{[0-9]+}}, [sp], #32 1052*9880d681SAndroid Build Coastguard Worker; CHECK: ret 1053*9880d681SAndroid Build Coastguard Worker %src = alloca { i64, i64 }, align 8 1054*9880d681SAndroid Build Coastguard Worker %dst = alloca { i64, i64 }, align 8 1055*9880d681SAndroid Build Coastguard Worker 1056*9880d681SAndroid Build Coastguard Worker %src.realp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %src, i32 0, i32 0 1057*9880d681SAndroid Build Coastguard Worker %src.real = load i64, i64* %src.realp 1058*9880d681SAndroid Build Coastguard Worker %src.imagp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %src, i32 0, i32 1 1059*9880d681SAndroid Build Coastguard Worker %src.imag = load i64, i64* %src.imagp 1060*9880d681SAndroid Build Coastguard Worker 1061*9880d681SAndroid Build Coastguard Worker %dst.realp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %dst, i32 0, i32 0 1062*9880d681SAndroid Build Coastguard Worker %dst.imagp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %dst, i32 0, i32 1 1063*9880d681SAndroid Build Coastguard Worker store i64 %src.real, i64* %dst.realp 1064*9880d681SAndroid Build Coastguard Worker store i64 %src.imag, i64* %dst.imagp 1065*9880d681SAndroid Build Coastguard Worker ret void 1066*9880d681SAndroid Build Coastguard Worker} 1067*9880d681SAndroid Build Coastguard Worker 1068*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-float() nounwind { 1069*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-float 1070*9880d681SAndroid Build Coastguard Worker; CHECK: stp s{{[0-9]+}}, s{{[0-9]+}}, [sp], #16 1071*9880d681SAndroid Build Coastguard Worker; CHECK: ret 1072*9880d681SAndroid Build Coastguard Worker %src = alloca { float, float }, align 8 1073*9880d681SAndroid Build Coastguard Worker %dst = alloca { float, float }, align 8 1074*9880d681SAndroid Build Coastguard Worker 1075*9880d681SAndroid Build Coastguard Worker %src.realp = getelementptr inbounds { float, float }, { float, float }* %src, i32 0, i32 0 1076*9880d681SAndroid Build Coastguard Worker %src.real = load float, float* %src.realp 1077*9880d681SAndroid Build Coastguard Worker %src.imagp = getelementptr inbounds { float, float }, { float, float }* %src, i32 0, i32 1 1078*9880d681SAndroid Build Coastguard Worker %src.imag = load float, float* %src.imagp 1079*9880d681SAndroid Build Coastguard Worker 1080*9880d681SAndroid Build Coastguard Worker %dst.realp = getelementptr inbounds { float, float }, { float, float }* %dst, i32 0, i32 0 1081*9880d681SAndroid Build Coastguard Worker %dst.imagp = getelementptr inbounds { float, float }, { float, float }* %dst, i32 0, i32 1 1082*9880d681SAndroid Build Coastguard Worker store float %src.real, float* %dst.realp 1083*9880d681SAndroid Build Coastguard Worker store float %src.imag, float* %dst.imagp 1084*9880d681SAndroid Build Coastguard Worker ret void 1085*9880d681SAndroid Build Coastguard Worker} 1086*9880d681SAndroid Build Coastguard Worker 1087*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-double() nounwind { 1088*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-double 1089*9880d681SAndroid Build Coastguard Worker; CHECK: stp d{{[0-9]+}}, d{{[0-9]+}}, [sp], #32 1090*9880d681SAndroid Build Coastguard Worker; CHECK: ret 1091*9880d681SAndroid Build Coastguard Worker %src = alloca { double, double }, align 8 1092*9880d681SAndroid Build Coastguard Worker %dst = alloca { double, double }, align 8 1093*9880d681SAndroid Build Coastguard Worker 1094*9880d681SAndroid Build Coastguard Worker %src.realp = getelementptr inbounds { double, double }, { double, double }* %src, i32 0, i32 0 1095*9880d681SAndroid Build Coastguard Worker %src.real = load double, double* %src.realp 1096*9880d681SAndroid Build Coastguard Worker %src.imagp = getelementptr inbounds { double, double }, { double, double }* %src, i32 0, i32 1 1097*9880d681SAndroid Build Coastguard Worker %src.imag = load double, double* %src.imagp 1098*9880d681SAndroid Build Coastguard Worker 1099*9880d681SAndroid Build Coastguard Worker %dst.realp = getelementptr inbounds { double, double }, { double, double }* %dst, i32 0, i32 0 1100*9880d681SAndroid Build Coastguard Worker %dst.imagp = getelementptr inbounds { double, double }, { double, double }* %dst, i32 0, i32 1 1101*9880d681SAndroid Build Coastguard Worker store double %src.real, double* %dst.realp 1102*9880d681SAndroid Build Coastguard Worker store double %src.imag, double* %dst.imagp 1103*9880d681SAndroid Build Coastguard Worker ret void 1104*9880d681SAndroid Build Coastguard Worker} 1105*9880d681SAndroid Build Coastguard Worker 1106*9880d681SAndroid Build Coastguard Worker; Check the following transform: 1107*9880d681SAndroid Build Coastguard Worker; 1108*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x20] 1109*9880d681SAndroid Build Coastguard Worker; ... 1110*9880d681SAndroid Build Coastguard Worker; sub x20, x20, #16 1111*9880d681SAndroid Build Coastguard Worker; -> 1112*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x20], #-16 1113*9880d681SAndroid Build Coastguard Worker; 1114*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0. 1115*9880d681SAndroid Build Coastguard Worker 1116*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-word(i32* %a, i32* %b, i64 %count) nounwind { 1117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-word 1118*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}], #-8 1119*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}], #-8 1120*9880d681SAndroid Build Coastguard Worker br label %for.body 1121*9880d681SAndroid Build Coastguard Workerfor.body: 1122*9880d681SAndroid Build Coastguard Worker %phi1 = phi i32* [ %gep4, %for.body ], [ %b, %0 ] 1123*9880d681SAndroid Build Coastguard Worker %phi2 = phi i32* [ %gep3, %for.body ], [ %a, %0 ] 1124*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ] 1125*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i32, i32* %phi1, i64 -1 1126*9880d681SAndroid Build Coastguard Worker %load1 = load i32, i32* %gep1 1127*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i32, i32* %phi2, i64 -1 1128*9880d681SAndroid Build Coastguard Worker store i32 %load1, i32* %gep2 1129*9880d681SAndroid Build Coastguard Worker %load2 = load i32, i32* %phi1 1130*9880d681SAndroid Build Coastguard Worker store i32 %load2, i32* %phi2 1131*9880d681SAndroid Build Coastguard Worker %dec.i = add nsw i64 %i, -1 1132*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i32, i32* %phi2, i64 -2 1133*9880d681SAndroid Build Coastguard Worker %gep4 = getelementptr i32, i32* %phi1, i64 -2 1134*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i64 %dec.i, 0 1135*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %end 1136*9880d681SAndroid Build Coastguard Workerend: 1137*9880d681SAndroid Build Coastguard Worker ret void 1138*9880d681SAndroid Build Coastguard Worker} 1139*9880d681SAndroid Build Coastguard Worker 1140*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-doubleword(i64* %a, i64* %b, i64 %count) nounwind { 1141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-doubleword 1142*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}], #-16 1143*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}], #-16 1144*9880d681SAndroid Build Coastguard Worker br label %for.body 1145*9880d681SAndroid Build Coastguard Workerfor.body: 1146*9880d681SAndroid Build Coastguard Worker %phi1 = phi i64* [ %gep4, %for.body ], [ %b, %0 ] 1147*9880d681SAndroid Build Coastguard Worker %phi2 = phi i64* [ %gep3, %for.body ], [ %a, %0 ] 1148*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ] 1149*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr i64, i64* %phi1, i64 -1 1150*9880d681SAndroid Build Coastguard Worker %load1 = load i64, i64* %gep1 1151*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr i64, i64* %phi2, i64 -1 1152*9880d681SAndroid Build Coastguard Worker store i64 %load1, i64* %gep2 1153*9880d681SAndroid Build Coastguard Worker %load2 = load i64, i64* %phi1 1154*9880d681SAndroid Build Coastguard Worker store i64 %load2, i64* %phi2 1155*9880d681SAndroid Build Coastguard Worker %dec.i = add nsw i64 %i, -1 1156*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr i64, i64* %phi2, i64 -2 1157*9880d681SAndroid Build Coastguard Worker %gep4 = getelementptr i64, i64* %phi1, i64 -2 1158*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i64 %dec.i, 0 1159*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %end 1160*9880d681SAndroid Build Coastguard Workerend: 1161*9880d681SAndroid Build Coastguard Worker ret void 1162*9880d681SAndroid Build Coastguard Worker} 1163*9880d681SAndroid Build Coastguard Worker 1164*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-quadword(<2 x i64>* %a, <2 x i64>* %b, i64 %count) nounwind { 1165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-quadword 1166*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}], #-32 1167*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}], #-32 1168*9880d681SAndroid Build Coastguard Worker br label %for.body 1169*9880d681SAndroid Build Coastguard Workerfor.body: 1170*9880d681SAndroid Build Coastguard Worker %phi1 = phi <2 x i64>* [ %gep4, %for.body ], [ %b, %0 ] 1171*9880d681SAndroid Build Coastguard Worker %phi2 = phi <2 x i64>* [ %gep3, %for.body ], [ %a, %0 ] 1172*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ] 1173*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr <2 x i64>, <2 x i64>* %phi1, i64 -1 1174*9880d681SAndroid Build Coastguard Worker %load1 = load <2 x i64>, <2 x i64>* %gep1 1175*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr <2 x i64>, <2 x i64>* %phi2, i64 -1 1176*9880d681SAndroid Build Coastguard Worker store <2 x i64> %load1, <2 x i64>* %gep2 1177*9880d681SAndroid Build Coastguard Worker %load2 = load <2 x i64>, <2 x i64>* %phi1 1178*9880d681SAndroid Build Coastguard Worker store <2 x i64> %load2, <2 x i64>* %phi2 1179*9880d681SAndroid Build Coastguard Worker %dec.i = add nsw i64 %i, -1 1180*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr <2 x i64>, <2 x i64>* %phi2, i64 -2 1181*9880d681SAndroid Build Coastguard Worker %gep4 = getelementptr <2 x i64>, <2 x i64>* %phi1, i64 -2 1182*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i64 %dec.i, 0 1183*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %end 1184*9880d681SAndroid Build Coastguard Workerend: 1185*9880d681SAndroid Build Coastguard Worker ret void 1186*9880d681SAndroid Build Coastguard Worker} 1187*9880d681SAndroid Build Coastguard Worker 1188*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-float(float* %a, float* %b, i64 %count) nounwind { 1189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-float 1190*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}], #-8 1191*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}], #-8 1192*9880d681SAndroid Build Coastguard Worker br label %for.body 1193*9880d681SAndroid Build Coastguard Workerfor.body: 1194*9880d681SAndroid Build Coastguard Worker %phi1 = phi float* [ %gep4, %for.body ], [ %b, %0 ] 1195*9880d681SAndroid Build Coastguard Worker %phi2 = phi float* [ %gep3, %for.body ], [ %a, %0 ] 1196*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ] 1197*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr float, float* %phi1, i64 -1 1198*9880d681SAndroid Build Coastguard Worker %load1 = load float, float* %gep1 1199*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr float, float* %phi2, i64 -1 1200*9880d681SAndroid Build Coastguard Worker store float %load1, float* %gep2 1201*9880d681SAndroid Build Coastguard Worker %load2 = load float, float* %phi1 1202*9880d681SAndroid Build Coastguard Worker store float %load2, float* %phi2 1203*9880d681SAndroid Build Coastguard Worker %dec.i = add nsw i64 %i, -1 1204*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr float, float* %phi2, i64 -2 1205*9880d681SAndroid Build Coastguard Worker %gep4 = getelementptr float, float* %phi1, i64 -2 1206*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i64 %dec.i, 0 1207*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %end 1208*9880d681SAndroid Build Coastguard Workerend: 1209*9880d681SAndroid Build Coastguard Worker ret void 1210*9880d681SAndroid Build Coastguard Worker} 1211*9880d681SAndroid Build Coastguard Worker 1212*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-double(double* %a, double* %b, i64 %count) nounwind { 1213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-double 1214*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}], #-16 1215*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}], #-16 1216*9880d681SAndroid Build Coastguard Worker br label %for.body 1217*9880d681SAndroid Build Coastguard Workerfor.body: 1218*9880d681SAndroid Build Coastguard Worker %phi1 = phi double* [ %gep4, %for.body ], [ %b, %0 ] 1219*9880d681SAndroid Build Coastguard Worker %phi2 = phi double* [ %gep3, %for.body ], [ %a, %0 ] 1220*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ] 1221*9880d681SAndroid Build Coastguard Worker %gep1 = getelementptr double, double* %phi1, i64 -1 1222*9880d681SAndroid Build Coastguard Worker %load1 = load double, double* %gep1 1223*9880d681SAndroid Build Coastguard Worker %gep2 = getelementptr double, double* %phi2, i64 -1 1224*9880d681SAndroid Build Coastguard Worker store double %load1, double* %gep2 1225*9880d681SAndroid Build Coastguard Worker %load2 = load double, double* %phi1 1226*9880d681SAndroid Build Coastguard Worker store double %load2, double* %phi2 1227*9880d681SAndroid Build Coastguard Worker %dec.i = add nsw i64 %i, -1 1228*9880d681SAndroid Build Coastguard Worker %gep3 = getelementptr double, double* %phi2, i64 -2 1229*9880d681SAndroid Build Coastguard Worker %gep4 = getelementptr double, double* %phi1, i64 -2 1230*9880d681SAndroid Build Coastguard Worker %cond = icmp sgt i64 %dec.i, 0 1231*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %for.body, label %end 1232*9880d681SAndroid Build Coastguard Workerend: 1233*9880d681SAndroid Build Coastguard Worker ret void 1234*9880d681SAndroid Build Coastguard Worker} 1235