forked from OSchip/llvm-project
677 lines
23 KiB
LLVM
677 lines
23 KiB
LLVM
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
|
|
|
|
; Test folding constant offsets and symbols into load and store addresses under
|
|
; a variety of circumstances.
|
|
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
@g = external global [0 x i32], align 4
|
|
|
|
; CHECK-LABEL: load_test0:
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.load $push1=, g+40($pop0){{$}}
|
|
; CHECK-NEXT: return $pop1{{$}}
|
|
define i32 @load_test0() {
|
|
%t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test0_noinbounds:
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.load $push1=, g+40($pop0){{$}}
|
|
; CHECK-NEXT: return $pop1{{$}}
|
|
define i32 @load_test0_noinbounds() {
|
|
%t = load i32, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; TODO: load_test1 - load_test8 are disabled because folding GA+reg is disabled
|
|
; (there are cases where the value in the reg can be negative).
|
|
; Likewise for stores.
|
|
|
|
; CHECK-LABEL: load_test1:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test1(i32 %n) {
|
|
%add = add nsw i32 %n, 10
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test2:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test2(i32 %n) {
|
|
%add = add nsw i32 10, %n
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test3:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test3(i32 %n) {
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test4:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test4(i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test5:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test5(i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test6:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test6(i32 %n) {
|
|
%add = add nsw i32 %n, 10
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test7:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test7(i32 %n) {
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test8:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEX T: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.load $push2=, g+40($pop1){{$}}
|
|
; CHECK-NEX T: return $pop2{{$}}
|
|
define i32 @load_test8(i32 %n) {
|
|
%add = add nsw i32 10, %n
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test9:
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.load $push1=, g-40($pop0){{$}}
|
|
; CHECK-NEXT: return $pop1{{$}}
|
|
define i32 @load_test9() {
|
|
%t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test10:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.const $push2=, g-40{{$}}
|
|
; CHECK-NEXT: i32.add $push3=, $pop1, $pop2{{$}}
|
|
; CHECK-NEXT: i32.load $push4=, 0($pop3){{$}}
|
|
; CHECK-NEXT: return $pop4{{$}}
|
|
define i32 @load_test10(i32 %n) {
|
|
%add = add nsw i32 %n, -10
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test11:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.load $push0=, 40($0){{$}}
|
|
; CHECK-NEXT: return $pop0{{$}}
|
|
define i32 @load_test11(i32* %p) {
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 10
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test11_noinbounds:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.load $push2=, 0($pop1){{$}}
|
|
; CHECK-NEXT: return $pop2{{$}}
|
|
define i32 @load_test11_noinbounds(i32* %p) {
|
|
%arrayidx = getelementptr i32, i32* %p, i32 10
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test12:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test12(i32* %p, i32 %n) {
|
|
%add = add nsw i32 %n, 10
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test13:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test13(i32* %p, i32 %n) {
|
|
%add = add nsw i32 10, %n
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test14:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.load $push3=, 40($pop2){{$}}
|
|
; CHECK-NEXT: return $pop3{{$}}
|
|
define i32 @load_test14(i32* %p, i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test15:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test15(i32* %p, i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 10
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test16:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test16(i32* %p, i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 10
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test17:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test17(i32* %p, i32 %n) {
|
|
%add = add nsw i32 %n, 10
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test18:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.load $push3=, 40($pop2){{$}}
|
|
; CHECK-NEXT: return $pop3{{$}}
|
|
define i32 @load_test18(i32* %p, i32 %n) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
%t = load i32, i32* %add.ptr1, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test19:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test19(i32* %p, i32 %n) {
|
|
%add = add nsw i32 10, %n
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
|
|
%t = load i32, i32* %add.ptr, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test20:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, -40{{$}}
|
|
; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.load $push2=, 0($pop1){{$}}
|
|
; CHECK-NEXT: return $pop2{{$}}
|
|
define i32 @load_test20(i32* %p) {
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 -10
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: load_test21:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: result i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, -40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.load $push5=, 0($pop4){{$}}
|
|
; CHECK-NEXT: return $pop5{{$}}
|
|
define i32 @load_test21(i32* %p, i32 %n) {
|
|
%add = add nsw i32 %n, -10
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
%t = load i32, i32* %arrayidx, align 4
|
|
ret i32 %t
|
|
}
|
|
|
|
; CHECK-LABEL: store_test0:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.store g+40($pop0), $0{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test0(i32 %i) {
|
|
store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test0_noinbounds:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.store g+40($pop0), $0{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test0_noinbounds(i32 %i) {
|
|
store i32 %i, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test1:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test1(i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, 10
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test2:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test2(i32 %n, i32 %i) {
|
|
%add = add nsw i32 10, %n
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test3:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test3(i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test4:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test4(i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test5:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test5(i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test6:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test6(i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, 10
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test7:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test7(i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test8:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
|
|
; CHECK-NEX T: return{{$}}
|
|
define void @store_test8(i32 %n, i32 %i) {
|
|
%add = add nsw i32 10, %n
|
|
%add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test9:
|
|
; CHECK-NEXT: param i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 0{{$}}
|
|
; CHECK-NEXT: i32.store g-40($pop0), $0{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test9(i32 %i) {
|
|
store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test10:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.const $push2=, g-40{{$}}
|
|
; CHECK-NEXT: i32.add $push3=, $pop1, $pop2{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop3), $1{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test10(i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, -10
|
|
%arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test11:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.store 40($0), $1{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test11(i32* %p, i32 %i) {
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 10
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test11_noinbounds:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop1), $1{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test11_noinbounds(i32* %p, i32 %i) {
|
|
%arrayidx = getelementptr i32, i32* %p, i32 10
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test12:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test12(i32* %p, i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, 10
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test13:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test13(i32* %p, i32 %n, i32 %i) {
|
|
%add = add nsw i32 10, %n
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test14:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.store 40($pop2), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test14(i32* %p, i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test15:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test15(i32* %p, i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 10
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test16:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test16(i32* %p, i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 10
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test17:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test17(i32* %p, i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, 10
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test18:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.store 40($pop2), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test18(i32* %p, i32 %n, i32 %i) {
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
|
|
%add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
|
|
store i32 %i, i32* %add.ptr1, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test19:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, 40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test19(i32* %p, i32 %n, i32 %i) {
|
|
%add = add nsw i32 10, %n
|
|
%add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
|
|
store i32 %i, i32* %add.ptr, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test20:
|
|
; CHECK-NEXT: param i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, -40{{$}}
|
|
; CHECK-NEXT: i32.add $push1=, $0, $pop0{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop1), $1{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test20(i32* %p, i32 %i) {
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 -10
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: store_test21:
|
|
; CHECK-NEXT: param i32, i32, i32{{$}}
|
|
; CHECK-NEXT: i32.const $push0=, 2{{$}}
|
|
; CHECK-NEXT: i32.shl $push1=, $1, $pop0{{$}}
|
|
; CHECK-NEXT: i32.add $push2=, $0, $pop1{{$}}
|
|
; CHECK-NEXT: i32.const $push3=, -40{{$}}
|
|
; CHECK-NEXT: i32.add $push4=, $pop2, $pop3{{$}}
|
|
; CHECK-NEXT: i32.store 0($pop4), $2{{$}}
|
|
; CHECK-NEXT: return{{$}}
|
|
define void @store_test21(i32* %p, i32 %n, i32 %i) {
|
|
%add = add nsw i32 %n, -10
|
|
%arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
|
|
store i32 %i, i32* %arrayidx, align 4
|
|
ret void
|
|
}
|