772 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -relocation-model=pic | FileCheck %s3 4; Test folding constant offsets and symbols into load and store addresses under5; a variety of circumstances.6 7target triple = "wasm32-unknown-emscripten"8 9@g = external global [0 x i32], align 410 11define i32 @load_test0() {12; CHECK-LABEL: load_test0:13; CHECK: .functype load_test0 () -> (i32)14; CHECK-NEXT: # %bb.0:15; CHECK-NEXT: global.get $push0=, g@GOT16; CHECK-NEXT: i32.load $push1=, 40($pop0)17; CHECK-NEXT: return $pop118 %t = load i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), align 419 ret i32 %t20}21 22define i32 @load_test0_noinbounds() {23; CHECK-LABEL: load_test0_noinbounds:24; CHECK: .functype load_test0_noinbounds () -> (i32)25; CHECK-NEXT: # %bb.0:26; CHECK-NEXT: global.get $push1=, g@GOT27; CHECK-NEXT: i32.const $push0=, 4028; CHECK-NEXT: i32.add $push2=, $pop1, $pop029; CHECK-NEXT: i32.load $push3=, 0($pop2)30; CHECK-NEXT: return $pop331 %t = load i32, ptr getelementptr ([0 x i32], ptr @g, i32 0, i32 10), align 432 ret i32 %t33}34 35; TODO: load_test1 - load_test8 are disabled because folding GA+reg is disabled36; (there are cases where the value in the reg can be negative).37; Likewise for stores.38 39define i32 @load_test1(i32 %n) {40; CHECK-LABEL: load_test1:41; CHECK: .functype load_test1 (i32) -> (i32)42; CHECK-NEXT: # %bb.0:43; CHECK-NEXT: i32.const $push0=, 244; CHECK-NEXT: i32.shl $push1=, $0, $pop045; CHECK-NEXT: global.get $push2=, g@GOT46; CHECK-NEXT: i32.add $push3=, $pop1, $pop247; CHECK-NEXT: i32.const $push4=, 4048; CHECK-NEXT: i32.add $push5=, $pop3, $pop449; CHECK-NEXT: i32.load $push6=, 0($pop5)50; CHECK-NEXT: return $pop651 %add = add nsw i32 %n, 1052 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add53 %t = load i32, ptr %arrayidx, align 454 ret i32 %t55}56 57define i32 @load_test2(i32 %n) {58; CHECK-LABEL: load_test2:59; CHECK: .functype load_test2 (i32) -> (i32)60; CHECK-NEXT: # %bb.0:61; CHECK-NEXT: i32.const $push0=, 262; CHECK-NEXT: i32.shl $push1=, $0, $pop063; CHECK-NEXT: global.get $push2=, g@GOT64; CHECK-NEXT: i32.add $push3=, $pop1, $pop265; CHECK-NEXT: i32.const $push4=, 4066; CHECK-NEXT: i32.add $push5=, $pop3, $pop467; CHECK-NEXT: i32.load $push6=, 0($pop5)68; CHECK-NEXT: return $pop669 %add = add nsw i32 10, %n70 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add71 %t = load i32, ptr %arrayidx, align 472 ret i32 %t73}74 75define i32 @load_test3(i32 %n) {76; CHECK-LABEL: load_test3:77; CHECK: .functype load_test3 (i32) -> (i32)78; CHECK-NEXT: # %bb.0:79; CHECK-NEXT: global.get $push2=, g@GOT80; CHECK-NEXT: i32.const $push0=, 281; CHECK-NEXT: i32.shl $push1=, $0, $pop082; CHECK-NEXT: i32.add $push3=, $pop2, $pop183; CHECK-NEXT: i32.load $push4=, 40($pop3)84; CHECK-NEXT: return $pop485 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n86 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 1087 %t = load i32, ptr %add.ptr1, align 488 ret i32 %t89}90 91define i32 @load_test4(i32 %n) {92; CHECK-LABEL: load_test4:93; CHECK: .functype load_test4 (i32) -> (i32)94; CHECK-NEXT: # %bb.0:95; CHECK-NEXT: global.get $push2=, g@GOT96; CHECK-NEXT: i32.const $push0=, 297; CHECK-NEXT: i32.shl $push1=, $0, $pop098; CHECK-NEXT: i32.add $push3=, $pop2, $pop199; CHECK-NEXT: i32.const $push4=, 40100; CHECK-NEXT: i32.add $push5=, $pop3, $pop4101; CHECK-NEXT: i32.load $push6=, 0($pop5)102; CHECK-NEXT: return $pop6103 %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n104 %t = load i32, ptr %add.ptr, align 4105 ret i32 %t106}107 108define i32 @load_test5(i32 %n) {109; CHECK-LABEL: load_test5:110; CHECK: .functype load_test5 (i32) -> (i32)111; CHECK-NEXT: # %bb.0:112; CHECK-NEXT: global.get $push2=, g@GOT113; CHECK-NEXT: i32.const $push0=, 2114; CHECK-NEXT: i32.shl $push1=, $0, $pop0115; CHECK-NEXT: i32.add $push3=, $pop2, $pop1116; CHECK-NEXT: i32.const $push4=, 40117; CHECK-NEXT: i32.add $push5=, $pop3, $pop4118; CHECK-NEXT: i32.load $push6=, 0($pop5)119; CHECK-NEXT: return $pop6120 %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n121 %t = load i32, ptr %add.ptr, align 4122 ret i32 %t123}124 125define i32 @load_test6(i32 %n) {126; CHECK-LABEL: load_test6:127; CHECK: .functype load_test6 (i32) -> (i32)128; CHECK-NEXT: # %bb.0:129; CHECK-NEXT: i32.const $push0=, 2130; CHECK-NEXT: i32.shl $push1=, $0, $pop0131; CHECK-NEXT: global.get $push2=, g@GOT132; CHECK-NEXT: i32.add $push3=, $pop1, $pop2133; CHECK-NEXT: i32.const $push4=, 40134; CHECK-NEXT: i32.add $push5=, $pop3, $pop4135; CHECK-NEXT: i32.load $push6=, 0($pop5)136; CHECK-NEXT: return $pop6137 %add = add nsw i32 %n, 10138 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add139 %t = load i32, ptr %add.ptr, align 4140 ret i32 %t141}142 143define i32 @load_test7(i32 %n) {144; CHECK-LABEL: load_test7:145; CHECK: .functype load_test7 (i32) -> (i32)146; CHECK-NEXT: # %bb.0:147; CHECK-NEXT: global.get $push2=, g@GOT148; CHECK-NEXT: i32.const $push0=, 2149; CHECK-NEXT: i32.shl $push1=, $0, $pop0150; CHECK-NEXT: i32.add $push3=, $pop2, $pop1151; CHECK-NEXT: i32.load $push4=, 40($pop3)152; CHECK-NEXT: return $pop4153 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n154 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10155 %t = load i32, ptr %add.ptr1, align 4156 ret i32 %t157}158 159define i32 @load_test8(i32 %n) {160; CHECK-LABEL: load_test8:161; CHECK: .functype load_test8 (i32) -> (i32)162; CHECK-NEXT: # %bb.0:163; CHECK-NEXT: i32.const $push0=, 2164; CHECK-NEXT: i32.shl $push1=, $0, $pop0165; CHECK-NEXT: global.get $push2=, g@GOT166; CHECK-NEXT: i32.add $push3=, $pop1, $pop2167; CHECK-NEXT: i32.const $push4=, 40168; CHECK-NEXT: i32.add $push5=, $pop3, $pop4169; CHECK-NEXT: i32.load $push6=, 0($pop5)170; CHECK-NEXT: return $pop6171 %add = add nsw i32 10, %n172 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add173 %t = load i32, ptr %add.ptr, align 4174 ret i32 %t175}176 177define i32 @load_test9() {178; CHECK-LABEL: load_test9:179; CHECK: .functype load_test9 () -> (i32)180; CHECK-NEXT: # %bb.0:181; CHECK-NEXT: global.get $push1=, g@GOT182; CHECK-NEXT: i32.const $push0=, -40183; CHECK-NEXT: i32.add $push2=, $pop1, $pop0184; CHECK-NEXT: i32.load $push3=, 0($pop2)185; CHECK-NEXT: return $pop3186 %t = load i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 1073741814), align 4187 ret i32 %t188}189 190define i32 @load_test10(i32 %n) {191; CHECK-LABEL: load_test10:192; CHECK: .functype load_test10 (i32) -> (i32)193; CHECK-NEXT: # %bb.0:194; CHECK-NEXT: i32.const $push0=, 2195; CHECK-NEXT: i32.shl $push1=, $0, $pop0196; CHECK-NEXT: global.get $push2=, g@GOT197; CHECK-NEXT: i32.add $push3=, $pop1, $pop2198; CHECK-NEXT: i32.const $push4=, -40199; CHECK-NEXT: i32.add $push5=, $pop3, $pop4200; CHECK-NEXT: i32.load $push6=, 0($pop5)201; CHECK-NEXT: return $pop6202 %add = add nsw i32 %n, -10203 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add204 %t = load i32, ptr %arrayidx, align 4205 ret i32 %t206}207 208define i32 @load_test11(ptr %p) {209; CHECK-LABEL: load_test11:210; CHECK: .functype load_test11 (i32) -> (i32)211; CHECK-NEXT: # %bb.0:212; CHECK-NEXT: i32.load $push0=, 40($0)213; CHECK-NEXT: return $pop0214 %arrayidx = getelementptr inbounds i32, ptr %p, i32 10215 %t = load i32, ptr %arrayidx, align 4216 ret i32 %t217}218 219define i32 @load_test11_noinbounds(ptr %p) {220; CHECK-LABEL: load_test11_noinbounds:221; CHECK: .functype load_test11_noinbounds (i32) -> (i32)222; CHECK-NEXT: # %bb.0:223; CHECK-NEXT: i32.const $push0=, 40224; CHECK-NEXT: i32.add $push1=, $0, $pop0225; CHECK-NEXT: i32.load $push2=, 0($pop1)226; CHECK-NEXT: return $pop2227 %arrayidx = getelementptr i32, ptr %p, i32 10228 %t = load i32, ptr %arrayidx, align 4229 ret i32 %t230}231 232define i32 @load_test12(ptr %p, i32 %n) {233; CHECK-LABEL: load_test12:234; CHECK: .functype load_test12 (i32, i32) -> (i32)235; CHECK-NEXT: # %bb.0:236; CHECK-NEXT: i32.const $push0=, 2237; CHECK-NEXT: i32.shl $push1=, $1, $pop0238; CHECK-NEXT: i32.add $push2=, $pop1, $0239; CHECK-NEXT: i32.const $push3=, 40240; CHECK-NEXT: i32.add $push4=, $pop2, $pop3241; CHECK-NEXT: i32.load $push5=, 0($pop4)242; CHECK-NEXT: return $pop5243 %add = add nsw i32 %n, 10244 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add245 %t = load i32, ptr %arrayidx, align 4246 ret i32 %t247}248 249define i32 @load_test13(ptr %p, i32 %n) {250; CHECK-LABEL: load_test13:251; CHECK: .functype load_test13 (i32, i32) -> (i32)252; CHECK-NEXT: # %bb.0:253; CHECK-NEXT: i32.const $push0=, 2254; CHECK-NEXT: i32.shl $push1=, $1, $pop0255; CHECK-NEXT: i32.add $push2=, $pop1, $0256; CHECK-NEXT: i32.const $push3=, 40257; CHECK-NEXT: i32.add $push4=, $pop2, $pop3258; CHECK-NEXT: i32.load $push5=, 0($pop4)259; CHECK-NEXT: return $pop5260 %add = add nsw i32 10, %n261 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add262 %t = load i32, ptr %arrayidx, align 4263 ret i32 %t264}265 266define i32 @load_test14(ptr %p, i32 %n) {267; CHECK-LABEL: load_test14:268; CHECK: .functype load_test14 (i32, i32) -> (i32)269; CHECK-NEXT: # %bb.0:270; CHECK-NEXT: i32.const $push0=, 2271; CHECK-NEXT: i32.shl $push1=, $1, $pop0272; CHECK-NEXT: i32.add $push2=, $0, $pop1273; CHECK-NEXT: i32.load $push3=, 40($pop2)274; CHECK-NEXT: return $pop3275 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n276 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10277 %t = load i32, ptr %add.ptr1, align 4278 ret i32 %t279}280 281define i32 @load_test15(ptr %p, i32 %n) {282; CHECK-LABEL: load_test15:283; CHECK: .functype load_test15 (i32, i32) -> (i32)284; CHECK-NEXT: # %bb.0:285; CHECK-NEXT: i32.const $push0=, 2286; CHECK-NEXT: i32.shl $push1=, $1, $pop0287; CHECK-NEXT: i32.add $push2=, $0, $pop1288; CHECK-NEXT: i32.const $push3=, 40289; CHECK-NEXT: i32.add $push4=, $pop2, $pop3290; CHECK-NEXT: i32.load $push5=, 0($pop4)291; CHECK-NEXT: return $pop5292 %add.ptr = getelementptr inbounds i32, ptr %p, i32 10293 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n294 %t = load i32, ptr %add.ptr1, align 4295 ret i32 %t296}297 298define i32 @load_test16(ptr %p, i32 %n) {299; CHECK-LABEL: load_test16:300; CHECK: .functype load_test16 (i32, i32) -> (i32)301; CHECK-NEXT: # %bb.0:302; CHECK-NEXT: i32.const $push0=, 2303; CHECK-NEXT: i32.shl $push1=, $1, $pop0304; CHECK-NEXT: i32.add $push2=, $0, $pop1305; CHECK-NEXT: i32.const $push3=, 40306; CHECK-NEXT: i32.add $push4=, $pop2, $pop3307; CHECK-NEXT: i32.load $push5=, 0($pop4)308; CHECK-NEXT: return $pop5309 %add.ptr = getelementptr inbounds i32, ptr %p, i32 10310 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n311 %t = load i32, ptr %add.ptr1, align 4312 ret i32 %t313}314 315define i32 @load_test17(ptr %p, i32 %n) {316; CHECK-LABEL: load_test17:317; CHECK: .functype load_test17 (i32, i32) -> (i32)318; CHECK-NEXT: # %bb.0:319; CHECK-NEXT: i32.const $push0=, 2320; CHECK-NEXT: i32.shl $push1=, $1, $pop0321; CHECK-NEXT: i32.add $push2=, $pop1, $0322; CHECK-NEXT: i32.const $push3=, 40323; CHECK-NEXT: i32.add $push4=, $pop2, $pop3324; CHECK-NEXT: i32.load $push5=, 0($pop4)325; CHECK-NEXT: return $pop5326 %add = add nsw i32 %n, 10327 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add328 %t = load i32, ptr %add.ptr, align 4329 ret i32 %t330}331 332define i32 @load_test18(ptr %p, i32 %n) {333; CHECK-LABEL: load_test18:334; CHECK: .functype load_test18 (i32, i32) -> (i32)335; CHECK-NEXT: # %bb.0:336; CHECK-NEXT: i32.const $push0=, 2337; CHECK-NEXT: i32.shl $push1=, $1, $pop0338; CHECK-NEXT: i32.add $push2=, $0, $pop1339; CHECK-NEXT: i32.load $push3=, 40($pop2)340; CHECK-NEXT: return $pop3341 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n342 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10343 %t = load i32, ptr %add.ptr1, align 4344 ret i32 %t345}346 347define i32 @load_test19(ptr %p, i32 %n) {348; CHECK-LABEL: load_test19:349; CHECK: .functype load_test19 (i32, i32) -> (i32)350; CHECK-NEXT: # %bb.0:351; CHECK-NEXT: i32.const $push0=, 2352; CHECK-NEXT: i32.shl $push1=, $1, $pop0353; CHECK-NEXT: i32.add $push2=, $pop1, $0354; CHECK-NEXT: i32.const $push3=, 40355; CHECK-NEXT: i32.add $push4=, $pop2, $pop3356; CHECK-NEXT: i32.load $push5=, 0($pop4)357; CHECK-NEXT: return $pop5358 %add = add nsw i32 10, %n359 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add360 %t = load i32, ptr %add.ptr, align 4361 ret i32 %t362}363 364define i32 @load_test20(ptr %p) {365; CHECK-LABEL: load_test20:366; CHECK: .functype load_test20 (i32) -> (i32)367; CHECK-NEXT: # %bb.0:368; CHECK-NEXT: i32.const $push0=, -40369; CHECK-NEXT: i32.add $push1=, $0, $pop0370; CHECK-NEXT: i32.load $push2=, 0($pop1)371; CHECK-NEXT: return $pop2372 %arrayidx = getelementptr inbounds i32, ptr %p, i32 -10373 %t = load i32, ptr %arrayidx, align 4374 ret i32 %t375}376 377define i32 @load_test21(ptr %p, i32 %n) {378; CHECK-LABEL: load_test21:379; CHECK: .functype load_test21 (i32, i32) -> (i32)380; CHECK-NEXT: # %bb.0:381; CHECK-NEXT: i32.const $push0=, 2382; CHECK-NEXT: i32.shl $push1=, $1, $pop0383; CHECK-NEXT: i32.add $push2=, $pop1, $0384; CHECK-NEXT: i32.const $push3=, -40385; CHECK-NEXT: i32.add $push4=, $pop2, $pop3386; CHECK-NEXT: i32.load $push5=, 0($pop4)387; CHECK-NEXT: return $pop5388 %add = add nsw i32 %n, -10389 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add390 %t = load i32, ptr %arrayidx, align 4391 ret i32 %t392}393 394define void @store_test0(i32 %i) {395; CHECK-LABEL: store_test0:396; CHECK: .functype store_test0 (i32) -> ()397; CHECK-NEXT: # %bb.0:398; CHECK-NEXT: global.get $push0=, g@GOT399; CHECK-NEXT: i32.store 40($pop0), $0400; CHECK-NEXT: return401 store i32 %i, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), align 4402 ret void403}404 405define void @store_test0_noinbounds(i32 %i) {406; CHECK-LABEL: store_test0_noinbounds:407; CHECK: .functype store_test0_noinbounds (i32) -> ()408; CHECK-NEXT: # %bb.0:409; CHECK-NEXT: global.get $push1=, g@GOT410; CHECK-NEXT: i32.const $push0=, 40411; CHECK-NEXT: i32.add $push2=, $pop1, $pop0412; CHECK-NEXT: i32.store 0($pop2), $0413; CHECK-NEXT: return414 store i32 %i, ptr getelementptr ([0 x i32], ptr @g, i32 0, i32 10), align 4415 ret void416}417 418define void @store_test1(i32 %n, i32 %i) {419; CHECK-LABEL: store_test1:420; CHECK: .functype store_test1 (i32, i32) -> ()421; CHECK-NEXT: # %bb.0:422; CHECK-NEXT: i32.const $push0=, 2423; CHECK-NEXT: i32.shl $push1=, $0, $pop0424; CHECK-NEXT: global.get $push2=, g@GOT425; CHECK-NEXT: i32.add $push3=, $pop1, $pop2426; CHECK-NEXT: i32.const $push4=, 40427; CHECK-NEXT: i32.add $push5=, $pop3, $pop4428; CHECK-NEXT: i32.store 0($pop5), $1429; CHECK-NEXT: return430 %add = add nsw i32 %n, 10431 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add432 store i32 %i, ptr %arrayidx, align 4433 ret void434}435 436define void @store_test2(i32 %n, i32 %i) {437; CHECK-LABEL: store_test2:438; CHECK: .functype store_test2 (i32, i32) -> ()439; CHECK-NEXT: # %bb.0:440; CHECK-NEXT: i32.const $push0=, 2441; CHECK-NEXT: i32.shl $push1=, $0, $pop0442; CHECK-NEXT: global.get $push2=, g@GOT443; CHECK-NEXT: i32.add $push3=, $pop1, $pop2444; CHECK-NEXT: i32.const $push4=, 40445; CHECK-NEXT: i32.add $push5=, $pop3, $pop4446; CHECK-NEXT: i32.store 0($pop5), $1447; CHECK-NEXT: return448 %add = add nsw i32 10, %n449 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add450 store i32 %i, ptr %arrayidx, align 4451 ret void452}453 454define void @store_test3(i32 %n, i32 %i) {455; CHECK-LABEL: store_test3:456; CHECK: .functype store_test3 (i32, i32) -> ()457; CHECK-NEXT: # %bb.0:458; CHECK-NEXT: global.get $push2=, g@GOT459; CHECK-NEXT: i32.const $push0=, 2460; CHECK-NEXT: i32.shl $push1=, $0, $pop0461; CHECK-NEXT: i32.add $push3=, $pop2, $pop1462; CHECK-NEXT: i32.store 40($pop3), $1463; CHECK-NEXT: return464 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n465 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10466 store i32 %i, ptr %add.ptr1, align 4467 ret void468}469 470define void @store_test4(i32 %n, i32 %i) {471; CHECK-LABEL: store_test4:472; CHECK: .functype store_test4 (i32, i32) -> ()473; CHECK-NEXT: # %bb.0:474; CHECK-NEXT: global.get $push2=, g@GOT475; CHECK-NEXT: i32.const $push0=, 2476; CHECK-NEXT: i32.shl $push1=, $0, $pop0477; CHECK-NEXT: i32.add $push3=, $pop2, $pop1478; CHECK-NEXT: i32.const $push4=, 40479; CHECK-NEXT: i32.add $push5=, $pop3, $pop4480; CHECK-NEXT: i32.store 0($pop5), $1481; CHECK-NEXT: return482 %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n483 store i32 %i, ptr %add.ptr, align 4484 ret void485}486 487define void @store_test5(i32 %n, i32 %i) {488; CHECK-LABEL: store_test5:489; CHECK: .functype store_test5 (i32, i32) -> ()490; CHECK-NEXT: # %bb.0:491; CHECK-NEXT: global.get $push2=, g@GOT492; CHECK-NEXT: i32.const $push0=, 2493; CHECK-NEXT: i32.shl $push1=, $0, $pop0494; CHECK-NEXT: i32.add $push3=, $pop2, $pop1495; CHECK-NEXT: i32.const $push4=, 40496; CHECK-NEXT: i32.add $push5=, $pop3, $pop4497; CHECK-NEXT: i32.store 0($pop5), $1498; CHECK-NEXT: return499 %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n500 store i32 %i, ptr %add.ptr, align 4501 ret void502}503 504define void @store_test6(i32 %n, i32 %i) {505; CHECK-LABEL: store_test6:506; CHECK: .functype store_test6 (i32, i32) -> ()507; CHECK-NEXT: # %bb.0:508; CHECK-NEXT: i32.const $push0=, 2509; CHECK-NEXT: i32.shl $push1=, $0, $pop0510; CHECK-NEXT: global.get $push2=, g@GOT511; CHECK-NEXT: i32.add $push3=, $pop1, $pop2512; CHECK-NEXT: i32.const $push4=, 40513; CHECK-NEXT: i32.add $push5=, $pop3, $pop4514; CHECK-NEXT: i32.store 0($pop5), $1515; CHECK-NEXT: return516 %add = add nsw i32 %n, 10517 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add518 store i32 %i, ptr %add.ptr, align 4519 ret void520}521 522define void @store_test7(i32 %n, i32 %i) {523; CHECK-LABEL: store_test7:524; CHECK: .functype store_test7 (i32, i32) -> ()525; CHECK-NEXT: # %bb.0:526; CHECK-NEXT: global.get $push2=, g@GOT527; CHECK-NEXT: i32.const $push0=, 2528; CHECK-NEXT: i32.shl $push1=, $0, $pop0529; CHECK-NEXT: i32.add $push3=, $pop2, $pop1530; CHECK-NEXT: i32.store 40($pop3), $1531; CHECK-NEXT: return532 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n533 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10534 store i32 %i, ptr %add.ptr1, align 4535 ret void536}537 538define void @store_test8(i32 %n, i32 %i) {539; CHECK-LABEL: store_test8:540; CHECK: .functype store_test8 (i32, i32) -> ()541; CHECK-NEXT: # %bb.0:542; CHECK-NEXT: i32.const $push0=, 2543; CHECK-NEXT: i32.shl $push1=, $0, $pop0544; CHECK-NEXT: global.get $push2=, g@GOT545; CHECK-NEXT: i32.add $push3=, $pop1, $pop2546; CHECK-NEXT: i32.const $push4=, 40547; CHECK-NEXT: i32.add $push5=, $pop3, $pop4548; CHECK-NEXT: i32.store 0($pop5), $1549; CHECK-NEXT: return550 %add = add nsw i32 10, %n551 %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add552 store i32 %i, ptr %add.ptr, align 4553 ret void554}555 556define void @store_test9(i32 %i) {557; CHECK-LABEL: store_test9:558; CHECK: .functype store_test9 (i32) -> ()559; CHECK-NEXT: # %bb.0:560; CHECK-NEXT: global.get $push1=, g@GOT561; CHECK-NEXT: i32.const $push0=, -40562; CHECK-NEXT: i32.add $push2=, $pop1, $pop0563; CHECK-NEXT: i32.store 0($pop2), $0564; CHECK-NEXT: return565 store i32 %i, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 1073741814), align 4566 ret void567}568 569define void @store_test10(i32 %n, i32 %i) {570; CHECK-LABEL: store_test10:571; CHECK: .functype store_test10 (i32, i32) -> ()572; CHECK-NEXT: # %bb.0:573; CHECK-NEXT: i32.const $push0=, 2574; CHECK-NEXT: i32.shl $push1=, $0, $pop0575; CHECK-NEXT: global.get $push2=, g@GOT576; CHECK-NEXT: i32.add $push3=, $pop1, $pop2577; CHECK-NEXT: i32.const $push4=, -40578; CHECK-NEXT: i32.add $push5=, $pop3, $pop4579; CHECK-NEXT: i32.store 0($pop5), $1580; CHECK-NEXT: return581 %add = add nsw i32 %n, -10582 %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add583 store i32 %i, ptr %arrayidx, align 4584 ret void585}586 587define void @store_test11(ptr %p, i32 %i) {588; CHECK-LABEL: store_test11:589; CHECK: .functype store_test11 (i32, i32) -> ()590; CHECK-NEXT: # %bb.0:591; CHECK-NEXT: i32.store 40($0), $1592; CHECK-NEXT: return593 %arrayidx = getelementptr inbounds i32, ptr %p, i32 10594 store i32 %i, ptr %arrayidx, align 4595 ret void596}597 598define void @store_test11_noinbounds(ptr %p, i32 %i) {599; CHECK-LABEL: store_test11_noinbounds:600; CHECK: .functype store_test11_noinbounds (i32, i32) -> ()601; CHECK-NEXT: # %bb.0:602; CHECK-NEXT: i32.const $push0=, 40603; CHECK-NEXT: i32.add $push1=, $0, $pop0604; CHECK-NEXT: i32.store 0($pop1), $1605; CHECK-NEXT: return606 %arrayidx = getelementptr i32, ptr %p, i32 10607 store i32 %i, ptr %arrayidx, align 4608 ret void609}610 611define void @store_test12(ptr %p, i32 %n, i32 %i) {612; CHECK-LABEL: store_test12:613; CHECK: .functype store_test12 (i32, i32, i32) -> ()614; CHECK-NEXT: # %bb.0:615; CHECK-NEXT: i32.const $push0=, 2616; CHECK-NEXT: i32.shl $push1=, $1, $pop0617; CHECK-NEXT: i32.add $push2=, $pop1, $0618; CHECK-NEXT: i32.const $push3=, 40619; CHECK-NEXT: i32.add $push4=, $pop2, $pop3620; CHECK-NEXT: i32.store 0($pop4), $2621; CHECK-NEXT: return622 %add = add nsw i32 %n, 10623 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add624 store i32 %i, ptr %arrayidx, align 4625 ret void626}627 628define void @store_test13(ptr %p, i32 %n, i32 %i) {629; CHECK-LABEL: store_test13:630; CHECK: .functype store_test13 (i32, i32, i32) -> ()631; CHECK-NEXT: # %bb.0:632; CHECK-NEXT: i32.const $push0=, 2633; CHECK-NEXT: i32.shl $push1=, $1, $pop0634; CHECK-NEXT: i32.add $push2=, $pop1, $0635; CHECK-NEXT: i32.const $push3=, 40636; CHECK-NEXT: i32.add $push4=, $pop2, $pop3637; CHECK-NEXT: i32.store 0($pop4), $2638; CHECK-NEXT: return639 %add = add nsw i32 10, %n640 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add641 store i32 %i, ptr %arrayidx, align 4642 ret void643}644 645define void @store_test14(ptr %p, i32 %n, i32 %i) {646; CHECK-LABEL: store_test14:647; CHECK: .functype store_test14 (i32, i32, i32) -> ()648; CHECK-NEXT: # %bb.0:649; CHECK-NEXT: i32.const $push0=, 2650; CHECK-NEXT: i32.shl $push1=, $1, $pop0651; CHECK-NEXT: i32.add $push2=, $0, $pop1652; CHECK-NEXT: i32.store 40($pop2), $2653; CHECK-NEXT: return654 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n655 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10656 store i32 %i, ptr %add.ptr1, align 4657 ret void658}659 660define void @store_test15(ptr %p, i32 %n, i32 %i) {661; CHECK-LABEL: store_test15:662; CHECK: .functype store_test15 (i32, i32, i32) -> ()663; CHECK-NEXT: # %bb.0:664; CHECK-NEXT: i32.const $push0=, 2665; CHECK-NEXT: i32.shl $push1=, $1, $pop0666; CHECK-NEXT: i32.add $push2=, $0, $pop1667; CHECK-NEXT: i32.const $push3=, 40668; CHECK-NEXT: i32.add $push4=, $pop2, $pop3669; CHECK-NEXT: i32.store 0($pop4), $2670; CHECK-NEXT: return671 %add.ptr = getelementptr inbounds i32, ptr %p, i32 10672 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n673 store i32 %i, ptr %add.ptr1, align 4674 ret void675}676 677define void @store_test16(ptr %p, i32 %n, i32 %i) {678; CHECK-LABEL: store_test16:679; CHECK: .functype store_test16 (i32, i32, i32) -> ()680; CHECK-NEXT: # %bb.0:681; CHECK-NEXT: i32.const $push0=, 2682; CHECK-NEXT: i32.shl $push1=, $1, $pop0683; CHECK-NEXT: i32.add $push2=, $0, $pop1684; CHECK-NEXT: i32.const $push3=, 40685; CHECK-NEXT: i32.add $push4=, $pop2, $pop3686; CHECK-NEXT: i32.store 0($pop4), $2687; CHECK-NEXT: return688 %add.ptr = getelementptr inbounds i32, ptr %p, i32 10689 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n690 store i32 %i, ptr %add.ptr1, align 4691 ret void692}693 694define void @store_test17(ptr %p, i32 %n, i32 %i) {695; CHECK-LABEL: store_test17:696; CHECK: .functype store_test17 (i32, i32, i32) -> ()697; CHECK-NEXT: # %bb.0:698; CHECK-NEXT: i32.const $push0=, 2699; CHECK-NEXT: i32.shl $push1=, $1, $pop0700; CHECK-NEXT: i32.add $push2=, $pop1, $0701; CHECK-NEXT: i32.const $push3=, 40702; CHECK-NEXT: i32.add $push4=, $pop2, $pop3703; CHECK-NEXT: i32.store 0($pop4), $2704; CHECK-NEXT: return705 %add = add nsw i32 %n, 10706 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add707 store i32 %i, ptr %add.ptr, align 4708 ret void709}710 711define void @store_test18(ptr %p, i32 %n, i32 %i) {712; CHECK-LABEL: store_test18:713; CHECK: .functype store_test18 (i32, i32, i32) -> ()714; CHECK-NEXT: # %bb.0:715; CHECK-NEXT: i32.const $push0=, 2716; CHECK-NEXT: i32.shl $push1=, $1, $pop0717; CHECK-NEXT: i32.add $push2=, $0, $pop1718; CHECK-NEXT: i32.store 40($pop2), $2719; CHECK-NEXT: return720 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n721 %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10722 store i32 %i, ptr %add.ptr1, align 4723 ret void724}725 726define void @store_test19(ptr %p, i32 %n, i32 %i) {727; CHECK-LABEL: store_test19:728; CHECK: .functype store_test19 (i32, i32, i32) -> ()729; CHECK-NEXT: # %bb.0:730; CHECK-NEXT: i32.const $push0=, 2731; CHECK-NEXT: i32.shl $push1=, $1, $pop0732; CHECK-NEXT: i32.add $push2=, $pop1, $0733; CHECK-NEXT: i32.const $push3=, 40734; CHECK-NEXT: i32.add $push4=, $pop2, $pop3735; CHECK-NEXT: i32.store 0($pop4), $2736; CHECK-NEXT: return737 %add = add nsw i32 10, %n738 %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add739 store i32 %i, ptr %add.ptr, align 4740 ret void741}742 743define void @store_test20(ptr %p, i32 %i) {744; CHECK-LABEL: store_test20:745; CHECK: .functype store_test20 (i32, i32) -> ()746; CHECK-NEXT: # %bb.0:747; CHECK-NEXT: i32.const $push0=, -40748; CHECK-NEXT: i32.add $push1=, $0, $pop0749; CHECK-NEXT: i32.store 0($pop1), $1750; CHECK-NEXT: return751 %arrayidx = getelementptr inbounds i32, ptr %p, i32 -10752 store i32 %i, ptr %arrayidx, align 4753 ret void754}755 756define void @store_test21(ptr %p, i32 %n, i32 %i) {757; CHECK-LABEL: store_test21:758; CHECK: .functype store_test21 (i32, i32, i32) -> ()759; CHECK-NEXT: # %bb.0:760; CHECK-NEXT: i32.const $push0=, 2761; CHECK-NEXT: i32.shl $push1=, $1, $pop0762; CHECK-NEXT: i32.add $push2=, $pop1, $0763; CHECK-NEXT: i32.const $push3=, -40764; CHECK-NEXT: i32.add $push4=, $pop2, $pop3765; CHECK-NEXT: i32.store 0($pop4), $2766; CHECK-NEXT: return767 %add = add nsw i32 %n, -10768 %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add769 store i32 %i, ptr %arrayidx, align 4770 ret void771}772