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-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32{{$}}
; CHECK-NEXT: result i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
-; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.load $push2=, g+40($pop1){{$}}
-; CHECK-NEXT: return $pop2{{$}}
+; 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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
; CHECK-NEXT: param i32, i32{{$}}
; CHECK-NEXT: i32.const $push0=, 2{{$}}
; CHECK-NEXT: i32.shl $push1=, $0, $pop0{{$}}
-; CHECK-NEXT: i32.store $drop=, g+40($pop1), $1{{$}}
-; CHECK-NEXT: return{{$}}
+; CHECK-NEX T: i32.store $drop=, 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