1; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -relocation-model=pic | FileCheck %s -check-prefixes=CHECK,PIC 2 3 4; Test folding constant offsets and symbols into load and store addresses under 5; a variety of circumstances. 6 7target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 8target triple = "wasm32-unknown-emscripten" 9 10@g = external global [0 x i32], align 4 11 12; CHECK-LABEL: load_test0: 13; CHECK-NEXT: .functype load_test0 () -> (i32){{$}} 14; PIC-NEXT: global.get $push0=, g@GOT{{$}} 15; PIC-NEXT: i32.load $push1=, 40($pop0){{$}} 16; CHECK-NEXT: return $pop1{{$}} 17define i32 @load_test0() { 18 %t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4 19 ret i32 %t 20} 21 22; CHECK-LABEL: load_test0_noinbounds: 23; CHECK-NEXT: .functype load_test0_noinbounds () -> (i32){{$}} 24; PIC-NEXT: global.get $push0=, g@GOT{{$}} 25; PIC-NEXT: i32.load $push1=, 40($pop0){{$}} 26; CHECK-NEXT: return $pop1{{$}} 27define i32 @load_test0_noinbounds() { 28 %t = load i32, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4 29 ret i32 %t 30} 31 32; TODO: load_test1 - load_test8 are disabled because folding GA+reg is disabled 33; (there are cases where the value in the reg can be negative). 34; Likewise for stores. 35 36; CHECK-LABEL: load_test1: 37; CHECK-NEXT: .functype load_test1 (i32) -> (i32){{$}} 38; CHECK-NEX T: i32.const $push0=, 2{{$}} 39; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 40; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 41; CHECK-NEX T: return $pop2{{$}} 42define i32 @load_test1(i32 %n) { 43 %add = add nsw i32 %n, 10 44 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 45 %t = load i32, i32* %arrayidx, align 4 46 ret i32 %t 47} 48 49; CHECK-LABEL: load_test2: 50; CHECK-NEXT: .functype load_test2 (i32) -> (i32){{$}} 51; CHECK-NEX T: i32.const $push0=, 2{{$}} 52; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 53; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 54; CHECK-NEX T: return $pop2{{$}} 55define i32 @load_test2(i32 %n) { 56 %add = add nsw i32 10, %n 57 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 58 %t = load i32, i32* %arrayidx, align 4 59 ret i32 %t 60} 61 62; CHECK-LABEL: load_test3: 63; CHECK-NEXT: .functype load_test3 (i32) -> (i32){{$}} 64; CHECK-NEX T: i32.const $push0=, 2{{$}} 65; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 66; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 67; CHECK-NEX T: return $pop2{{$}} 68define i32 @load_test3(i32 %n) { 69 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n 70 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 71 %t = load i32, i32* %add.ptr1, align 4 72 ret i32 %t 73} 74 75; CHECK-LABEL: load_test4: 76; CHECK-NEXT: .functype load_test4 (i32) -> (i32){{$}} 77; CHECK-NEX T: i32.const $push0=, 2{{$}} 78; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 79; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 80; CHECK-NEX T: return $pop2{{$}} 81define i32 @load_test4(i32 %n) { 82 %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n 83 %t = load i32, i32* %add.ptr, align 4 84 ret i32 %t 85} 86 87; CHECK-LABEL: load_test5: 88; CHECK-NEXT: .functype load_test5 (i32) -> (i32){{$}} 89; CHECK-NEX T: i32.const $push0=, 2{{$}} 90; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 91; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 92; CHECK-NEX T: return $pop2{{$}} 93define i32 @load_test5(i32 %n) { 94 %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n 95 %t = load i32, i32* %add.ptr, align 4 96 ret i32 %t 97} 98 99; CHECK-LABEL: load_test6: 100; CHECK-NEXT: .functype load_test6 (i32) -> (i32){{$}} 101; CHECK-NEX T: i32.const $push0=, 2{{$}} 102; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 103; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 104; CHECK-NEX T: return $pop2{{$}} 105define i32 @load_test6(i32 %n) { 106 %add = add nsw i32 %n, 10 107 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 108 %t = load i32, i32* %add.ptr, align 4 109 ret i32 %t 110} 111 112; CHECK-LABEL: load_test7: 113; CHECK-NEXT: .functype load_test7 (i32) -> (i32){{$}} 114; CHECK-NEX T: i32.const $push0=, 2{{$}} 115; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 116; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 117; CHECK-NEX T: return $pop2{{$}} 118define i32 @load_test7(i32 %n) { 119 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n 120 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 121 %t = load i32, i32* %add.ptr1, align 4 122 ret i32 %t 123} 124 125; CHECK-LABEL: load_test8: 126; CHECK-NEXT: .functype load_test8 (i32) -> (i32){{$}} 127; CHECK-NEX T: i32.const $push0=, 2{{$}} 128; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}} 129; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}} 130; CHECK-NEX T: return $pop2{{$}} 131define i32 @load_test8(i32 %n) { 132 %add = add nsw i32 10, %n 133 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 134 %t = load i32, i32* %add.ptr, align 4 135 ret i32 %t 136} 137 138; CHECK-LABEL: load_test9: 139; CHECK-NEXT: .functype load_test9 () -> (i32){{$}} 140 141; PIC-NEXT: global.get $push1=, g@GOT{{$}} 142; PIC-NEXT: i32.const $push0=, -40{{$}} 143; PIC-NEXT: i32.add $push2=, $pop1, $pop0{{$}} 144; PIC-NEXT: i32.load $push3=, 0($pop2) 145; PIC-NEXT: return $pop3{{$}} 146define i32 @load_test9() { 147 %t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4 148 ret i32 %t 149} 150 151; CHECK-LABEL: load_test10: 152; CHECK-NEXT: .functype load_test10 (i32) -> (i32){{$}} 153 154; PIC-NEXT: i32.const $push0=, 2{{$}} 155; PIC-NEXT: i32.shl $push1=, $0, $pop0{{$}} 156; PIC-NEXT: global.get $push2=, g@GOT{{$}} 157; PIC-NEXT: i32.add $push3=, $pop1, $pop2{{$}} 158; PIC-NEXT: i32.const $push4=, -40{{$}} 159; PIC-NEXT: i32.add $push5=, $pop3, $pop4{{$}} 160; PIC-NEXT: i32.load $push6=, 0($pop5){{$}} 161; PIC-NEXT: return $pop6{{$}} 162define i32 @load_test10(i32 %n) { 163 %add = add nsw i32 %n, -10 164 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 165 %t = load i32, i32* %arrayidx, align 4 166 ret i32 %t 167} 168 169; CHECK-LABEL: load_test11: 170; CHECK-NEXT: .functype load_test11 (i32) -> (i32){{$}} 171; CHECK-NEXT: i32.load $push0=, 40($0){{$}} 172; CHECK-NEXT: return $pop0{{$}} 173define i32 @load_test11(i32* %p) { 174 %arrayidx = getelementptr inbounds i32, i32* %p, i32 10 175 %t = load i32, i32* %arrayidx, align 4 176 ret i32 %t 177} 178 179; CHECK-LABEL: load_test11_noinbounds: 180; CHECK-NEXT: .functype load_test11_noinbounds (i32) -> (i32){{$}} 181; CHECK-NEXT: i32.const $push0=, 40{{$}} 182; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}} 183; CHECK-NEXT: i32.load $push2=, 0($pop1){{$}} 184; CHECK-NEXT: return $pop2{{$}} 185define i32 @load_test11_noinbounds(i32* %p) { 186 %arrayidx = getelementptr i32, i32* %p, i32 10 187 %t = load i32, i32* %arrayidx, align 4 188 ret i32 %t 189} 190 191; CHECK-LABEL: load_test12: 192; CHECK-NEXT: .functype load_test12 (i32, i32) -> (i32){{$}} 193; CHECK-NEXT: i32.const $push0=, 2{{$}} 194; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 195; CHECK-NEXT: i32.add $push2=, $pop1, $0{{$}} 196; CHECK-NEXT: i32.const $push3=, 40{{$}} 197; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 198; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 199; CHECK-NEXT: return $pop5{{$}} 200define i32 @load_test12(i32* %p, i32 %n) { 201 %add = add nsw i32 %n, 10 202 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 203 %t = load i32, i32* %arrayidx, align 4 204 ret i32 %t 205} 206 207; CHECK-LABEL: load_test13: 208; CHECK-NEXT: .functype load_test13 (i32, i32) -> (i32){{$}} 209; CHECK-NEXT: i32.const $push0=, 2{{$}} 210; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 211; CHECK-NEXT: i32.add $push2=, $pop1, $0{{$}} 212; CHECK-NEXT: i32.const $push3=, 40{{$}} 213; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 214; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 215; CHECK-NEXT: return $pop5{{$}} 216define i32 @load_test13(i32* %p, i32 %n) { 217 %add = add nsw i32 10, %n 218 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 219 %t = load i32, i32* %arrayidx, align 4 220 ret i32 %t 221} 222 223; CHECK-LABEL: load_test14: 224; CHECK-NEXT: .functype load_test14 (i32, i32) -> (i32){{$}} 225; CHECK-NEXT: i32.const $push0=, 2{{$}} 226; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 227; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}} 228; CHECK-NEXT: i32.load $push3=, 40($pop2){{$}} 229; CHECK-NEXT: return $pop3{{$}} 230define i32 @load_test14(i32* %p, i32 %n) { 231 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n 232 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 233 %t = load i32, i32* %add.ptr1, align 4 234 ret i32 %t 235} 236 237; CHECK-LABEL: load_test15: 238; CHECK-NEXT: .functype load_test15 (i32, i32) -> (i32){{$}} 239; CHECK-NEXT: i32.const $push0=, 2{{$}} 240; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 241; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}} 242; CHECK-NEXT: i32.const $push3=, 40{{$}} 243; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 244; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 245; CHECK-NEXT: return $pop5{{$}} 246define i32 @load_test15(i32* %p, i32 %n) { 247 %add.ptr = getelementptr inbounds i32, i32* %p, i32 10 248 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n 249 %t = load i32, i32* %add.ptr1, align 4 250 ret i32 %t 251} 252 253; CHECK-LABEL: load_test16: 254; CHECK-NEXT: .functype load_test16 (i32, i32) -> (i32){{$}} 255; CHECK-NEXT: i32.const $push0=, 2{{$}} 256; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 257; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}} 258; CHECK-NEXT: i32.const $push3=, 40{{$}} 259; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 260; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 261; CHECK-NEXT: return $pop5{{$}} 262define i32 @load_test16(i32* %p, i32 %n) { 263 %add.ptr = getelementptr inbounds i32, i32* %p, i32 10 264 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n 265 %t = load i32, i32* %add.ptr1, align 4 266 ret i32 %t 267} 268 269; CHECK-LABEL: load_test17: 270; CHECK-NEXT: .functype load_test17 (i32, i32) -> (i32){{$}} 271; CHECK-NEXT: i32.const $push0=, 2{{$}} 272; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 273; CHECK-NEXT: i32.add $push2=, $pop1, $0{{$}} 274; CHECK-NEXT: i32.const $push3=, 40{{$}} 275; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 276; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 277; CHECK-NEXT: return $pop5{{$}} 278define i32 @load_test17(i32* %p, i32 %n) { 279 %add = add nsw i32 %n, 10 280 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add 281 %t = load i32, i32* %add.ptr, align 4 282 ret i32 %t 283} 284 285; CHECK-LABEL: load_test18: 286; CHECK-NEXT: .functype load_test18 (i32, i32) -> (i32){{$}} 287; CHECK-NEXT: i32.const $push0=, 2{{$}} 288; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 289; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}} 290; CHECK-NEXT: i32.load $push3=, 40($pop2){{$}} 291; CHECK-NEXT: return $pop3{{$}} 292define i32 @load_test18(i32* %p, i32 %n) { 293 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n 294 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 295 %t = load i32, i32* %add.ptr1, align 4 296 ret i32 %t 297} 298 299; CHECK-LABEL: load_test19: 300; CHECK-NEXT: .functype load_test19 (i32, i32) -> (i32){{$}} 301; CHECK-NEXT: i32.const $push0=, 2{{$}} 302; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 303; CHECK-NEXT: i32.add $push2=, $pop1, $0{{$}} 304; CHECK-NEXT: i32.const $push3=, 40{{$}} 305; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 306; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 307; CHECK-NEXT: return $pop5{{$}} 308define i32 @load_test19(i32* %p, i32 %n) { 309 %add = add nsw i32 10, %n 310 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add 311 %t = load i32, i32* %add.ptr, align 4 312 ret i32 %t 313} 314 315; CHECK-LABEL: load_test20: 316; CHECK-NEXT: .functype load_test20 (i32) -> (i32){{$}} 317; CHECK-NEXT: i32.const $push0=, -40{{$}} 318; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}} 319; CHECK-NEXT: i32.load $push2=, 0($pop1){{$}} 320; CHECK-NEXT: return $pop2{{$}} 321define i32 @load_test20(i32* %p) { 322 %arrayidx = getelementptr inbounds i32, i32* %p, i32 -10 323 %t = load i32, i32* %arrayidx, align 4 324 ret i32 %t 325} 326 327; CHECK-LABEL: load_test21: 328; CHECK-NEXT: .functype load_test21 (i32, i32) -> (i32){{$}} 329; CHECK-NEXT: i32.const $push0=, 2{{$}} 330; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}} 331; CHECK-NEXT: i32.add $push2=, $pop1, $0{{$}} 332; CHECK-NEXT: i32.const $push3=, -40{{$}} 333; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}} 334; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}} 335; CHECK-NEXT: return $pop5{{$}} 336define i32 @load_test21(i32* %p, i32 %n) { 337 %add = add nsw i32 %n, -10 338 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 339 %t = load i32, i32* %arrayidx, align 4 340 ret i32 %t 341} 342 343; CHECK-LABEL: store_test0: 344; CHECK-NEXT: .functype store_test0 (i32) -> (){{$}} 345; PIC-NEXT: global.get $push0=, g@GOT{{$}} 346; PIC-NEXT: i32.store 40($pop0), $0 347; CHECK-NEXT: return{{$}} 348define void @store_test0(i32 %i) { 349 store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4 350 ret void 351} 352 353; CHECK-LABEL: store_test0_noinbounds: 354; CHECK-NEXT: .functype store_test0_noinbounds (i32) -> (){{$}} 355; PIC-NEXT: global.get $push0=, g@GOT{{$}} 356; PIC-NEXT: i32.store 40($pop0), $0{{$}} 357; CHECK-NEXT: return{{$}} 358define void @store_test0_noinbounds(i32 %i) { 359 store i32 %i, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4 360 ret void 361} 362 363; CHECK-LABEL: store_test1: 364; CHECK-NEXT: .functype store_test1 (i32, i32) -> (){{$}} 365; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 366; CHECK-NEX T: return{{$}} 367define void @store_test1(i32 %n, i32 %i) { 368 %add = add nsw i32 %n, 10 369 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 370 store i32 %i, i32* %arrayidx, align 4 371 ret void 372} 373 374; CHECK-LABEL: store_test2: 375; CHECK-NEXT: .functype store_test2 (i32, i32) -> (){{$}} 376; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 377; CHECK-NEX T: return{{$}} 378define void @store_test2(i32 %n, i32 %i) { 379 %add = add nsw i32 10, %n 380 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 381 store i32 %i, i32* %arrayidx, align 4 382 ret void 383} 384 385; CHECK-LABEL: store_test3: 386; CHECK-NEXT: .functype store_test3 (i32, i32) -> (){{$}} 387; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 388; CHECK-NEX T: return{{$}} 389define void @store_test3(i32 %n, i32 %i) { 390 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n 391 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 392 store i32 %i, i32* %add.ptr1, align 4 393 ret void 394} 395 396; CHECK-LABEL: store_test4: 397; CHECK-NEXT: .functype store_test4 (i32, i32) -> (){{$}} 398; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 399; CHECK-NEX T: return{{$}} 400define void @store_test4(i32 %n, i32 %i) { 401 %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n 402 store i32 %i, i32* %add.ptr, align 4 403 ret void 404} 405 406; CHECK-LABEL: store_test5: 407; CHECK-NEXT: .functype store_test5 (i32, i32) -> (){{$}} 408; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 409; CHECK-NEX T: return{{$}} 410define void @store_test5(i32 %n, i32 %i) { 411 %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n 412 store i32 %i, i32* %add.ptr, align 4 413 ret void 414} 415 416; CHECK-LABEL: store_test6: 417; CHECK-NEXT: .functype store_test6 (i32, i32) -> (){{$}} 418; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 419; CHECK-NEX T: return{{$}} 420define void @store_test6(i32 %n, i32 %i) { 421 %add = add nsw i32 %n, 10 422 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 423 store i32 %i, i32* %add.ptr, align 4 424 ret void 425} 426 427; CHECK-LABEL: store_test7: 428; CHECK-NEXT: .functype store_test7 (i32, i32) -> (){{$}} 429; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 430; CHECK-NEX T: return{{$}} 431define void @store_test7(i32 %n, i32 %i) { 432 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n 433 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 434 store i32 %i, i32* %add.ptr1, align 4 435 ret void 436} 437 438; CHECK-LABEL: store_test8: 439; CHECK-NEXT: .functype store_test8 (i32, i32) -> (){{$}} 440; CHECK-NEX T: i32.store g+40($pop1), $1{{$}} 441; CHECK-NEX T: return{{$}} 442define void @store_test8(i32 %n, i32 %i) { 443 %add = add nsw i32 10, %n 444 %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 445 store i32 %i, i32* %add.ptr, align 4 446 ret void 447} 448 449; CHECK-LABEL: store_test9: 450; CHECK-NEXT: .functype store_test9 (i32) -> (){{$}} 451; PIC-NEXT: global.get $push1=, g@GOT{{$}} 452; PIC-NEXT: i32.const $push0=, -40{{$}} 453; PIC-NEXT: i32.add $push2=, $pop1, $pop0{{$}} 454; PIC-NEXT: i32.store 0($pop2), $0 455; CHECK-NEXT: return{{$}} 456define void @store_test9(i32 %i) { 457 store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4 458 ret void 459} 460 461; CHECK-LABEL: store_test10: 462; CHECK-NEXT: .functype store_test10 (i32, i32) -> (){{$}} 463; PIC-NEXT: i32.const $push0=, 2{{$}} 464; PIC-NEXT: i32.shl $push1=, $0, $pop0{{$}} 465; PIC-NEXT: global.get $push2=, g@GOT{{$}} 466; PIC-NEXT: i32.add $push3=, $pop1, $pop2{{$}} 467; PIC-NEXT: i32.const $push4=, -40{{$}} 468; PIC-NEXT: i32.add $push5=, $pop3, $pop4{{$}} 469; PIC-NEXT: i32.store 0($pop5), $1{{$}} 470; CHECK-NEXT: return{{$}} 471define void @store_test10(i32 %n, i32 %i) { 472 %add = add nsw i32 %n, -10 473 %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add 474 store i32 %i, i32* %arrayidx, align 4 475 ret void 476} 477 478; CHECK-LABEL: store_test11: 479; CHECK-NEXT: .functype store_test11 (i32, i32) -> (){{$}} 480; CHECK-NEXT: i32.store 40($0), $1{{$}} 481; CHECK-NEXT: return{{$}} 482define void @store_test11(i32* %p, i32 %i) { 483 %arrayidx = getelementptr inbounds i32, i32* %p, i32 10 484 store i32 %i, i32* %arrayidx, align 4 485 ret void 486} 487 488; CHECK-LABEL: store_test11_noinbounds: 489; CHECK-NEXT: .functype store_test11_noinbounds (i32, i32) -> (){{$}} 490; CHECK-NEXT: i32.const $push0=, 40{{$}} 491; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}} 492; CHECK-NEXT: i32.store 0($pop1), $1{{$}} 493; CHECK-NEXT: return{{$}} 494define void @store_test11_noinbounds(i32* %p, i32 %i) { 495 %arrayidx = getelementptr i32, i32* %p, i32 10 496 store i32 %i, i32* %arrayidx, align 4 497 ret void 498} 499 500; CHECK-LABEL: store_test12: 501; CHECK-NEXT: .functype store_test12 (i32, i32, i32) -> (){{$}} 502define void @store_test12(i32* %p, i32 %n, i32 %i) { 503 %add = add nsw i32 %n, 10 504 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 505 store i32 %i, i32* %arrayidx, align 4 506 ret void 507} 508 509; CHECK-LABEL: store_test13: 510; CHECK-NEXT: .functype store_test13 (i32, i32, i32) -> (){{$}} 511define void @store_test13(i32* %p, i32 %n, i32 %i) { 512 %add = add nsw i32 10, %n 513 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 514 store i32 %i, i32* %arrayidx, align 4 515 ret void 516} 517 518; CHECK-LABEL: store_test14: 519; CHECK-NEXT: .functype store_test14 (i32, i32, i32) -> (){{$}} 520define void @store_test14(i32* %p, i32 %n, i32 %i) { 521 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n 522 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 523 store i32 %i, i32* %add.ptr1, align 4 524 ret void 525} 526 527; CHECK-LABEL: store_test15: 528; CHECK-NEXT: .functype store_test15 (i32, i32, i32) -> (){{$}} 529define void @store_test15(i32* %p, i32 %n, i32 %i) { 530 %add.ptr = getelementptr inbounds i32, i32* %p, i32 10 531 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n 532 store i32 %i, i32* %add.ptr1, align 4 533 ret void 534} 535 536; CHECK-LABEL: store_test16: 537; CHECK-NEXT: .functype store_test16 (i32, i32, i32) -> (){{$}} 538define void @store_test16(i32* %p, i32 %n, i32 %i) { 539 %add.ptr = getelementptr inbounds i32, i32* %p, i32 10 540 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n 541 store i32 %i, i32* %add.ptr1, align 4 542 ret void 543} 544 545; CHECK-LABEL: store_test17: 546; CHECK-NEXT: .functype store_test17 (i32, i32, i32) -> (){{$}} 547define void @store_test17(i32* %p, i32 %n, i32 %i) { 548 %add = add nsw i32 %n, 10 549 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add 550 store i32 %i, i32* %add.ptr, align 4 551 ret void 552} 553 554; CHECK-LABEL: store_test18: 555; CHECK-NEXT: .functype store_test18 (i32, i32, i32) -> (){{$}} 556define void @store_test18(i32* %p, i32 %n, i32 %i) { 557 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n 558 %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10 559 store i32 %i, i32* %add.ptr1, align 4 560 ret void 561} 562 563; CHECK-LABEL: store_test19: 564; CHECK-NEXT: .functype store_test19 (i32, i32, i32) -> (){{$}} 565define void @store_test19(i32* %p, i32 %n, i32 %i) { 566 %add = add nsw i32 10, %n 567 %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add 568 store i32 %i, i32* %add.ptr, align 4 569 ret void 570} 571 572; CHECK-LABEL: store_test20: 573; CHECK-NEXT: .functype store_test20 (i32, i32) -> (){{$}} 574define void @store_test20(i32* %p, i32 %i) { 575 %arrayidx = getelementptr inbounds i32, i32* %p, i32 -10 576 store i32 %i, i32* %arrayidx, align 4 577 ret void 578} 579 580; CHECK-LABEL: store_test21: 581; CHECK-NEXT: .functype store_test21 (i32, i32, i32) -> (){{$}} 582define void @store_test21(i32* %p, i32 %n, i32 %i) { 583 %add = add nsw i32 %n, -10 584 %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add 585 store i32 %i, i32* %arrayidx, align 4 586 ret void 587} 588