mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-19 19:03:50 +00:00
Add the SCCP regression tests for APInt expressions. These test cases
turned up some regressions that have since been fixed. We don't want to loose the regression tests. Test cases by Guoling Han. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35974 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4dcedf1e85
commit
c6b9efabee
23
test/Transforms/SCCP/apint-array.ll
Normal file
23
test/Transforms/SCCP/apint-array.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | grep 'ret i101 12'
|
||||
|
||||
@Y = constant [6 x i101] [ i101 12, i101 123456789000000, i101 -12,i101
|
||||
-123456789000000, i101 0,i101 9123456789000000]
|
||||
|
||||
define i101 @array()
|
||||
{
|
||||
Head:
|
||||
%A = getelementptr [6 x i101]* @Y, i32 0, i32 1
|
||||
|
||||
%B = load i101* %A
|
||||
%C = icmp sge i101 %B, 1
|
||||
br i1 %C, label %True, label %False
|
||||
True:
|
||||
%D = and i101 %B, 1
|
||||
%E = trunc i101 %D to i32
|
||||
%F = getelementptr [6 x i101]* @Y, i32 0, i32 %E
|
||||
%G = load i101* %F
|
||||
br label %False
|
||||
False:
|
||||
%H = phi i101 [%G, %True], [-1, %Head]
|
||||
ret i101 %H
|
||||
}
|
17
test/Transforms/SCCP/apint-basictest.ll
Normal file
17
test/Transforms/SCCP/apint-basictest.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; This is a basic sanity check for constant propogation. The add instruction
|
||||
; should be eliminated.
|
||||
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep add
|
||||
|
||||
define i128 @test(i1 %B) {
|
||||
br i1 %B, label %BB1, label %BB2
|
||||
BB1:
|
||||
%Val = add i128 0, 1
|
||||
br label %BB3
|
||||
BB2:
|
||||
br label %BB3
|
||||
BB3:
|
||||
%Ret = phi i128 [%Val, %BB1], [2, %BB2]
|
||||
ret i128 %Ret
|
||||
}
|
18
test/Transforms/SCCP/apint-basictest2.ll
Normal file
18
test/Transforms/SCCP/apint-basictest2.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; This is a basic sanity check for constant propogation. The add instruction
|
||||
; and phi instruction should be eliminated.
|
||||
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep phi
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep add
|
||||
|
||||
define i128 @test(i1 %B) {
|
||||
br i1 %B, label %BB1, label %BB2
|
||||
BB1:
|
||||
%Val = add i128 0, 1
|
||||
br label %BB3
|
||||
BB2:
|
||||
br label %BB3
|
||||
BB3:
|
||||
%Ret = phi i128 [%Val, %BB1], [1, %BB2]
|
||||
ret i128 %Ret
|
||||
}
|
24
test/Transforms/SCCP/apint-basictest3.ll
Normal file
24
test/Transforms/SCCP/apint-basictest3.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; This is a basic sanity check for constant propogation. It tests the basic
|
||||
; arithmatic operations.
|
||||
|
||||
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep mul
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep umod
|
||||
|
||||
define i128 @test(i1 %B) {
|
||||
br i1 %B, label %BB1, label %BB2
|
||||
BB1:
|
||||
%t1 = add i128 0, 1
|
||||
%t2 = sub i128 0, %t1
|
||||
%t3 = mul i128 %t2, -1
|
||||
br label %BB3
|
||||
BB2:
|
||||
%f1 = udiv i128 -1, 1
|
||||
%f2 = add i128 %f1, 1
|
||||
%f3 = umod i128 %f2, 2121
|
||||
br label %BB3
|
||||
BB3:
|
||||
%Ret = phi i128 [%t3, %BB1], [%f3, %BB2]
|
||||
ret i128 %Ret
|
||||
}
|
26
test/Transforms/SCCP/apint-basictest4.ll
Normal file
26
test/Transforms/SCCP/apint-basictest4.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; This is a basic sanity check for constant propogation. It tests the basic
|
||||
; logic operations.
|
||||
|
||||
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep and
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep trunc
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | grep "ret i100 -1"
|
||||
|
||||
define i100 @test(i133 %A) {
|
||||
%B = and i133 0, %A
|
||||
%C = icmp sgt i133 %B, 0
|
||||
br i1 %C, label %BB1, label %BB2
|
||||
BB1:
|
||||
%t3 = xor i133 %B, -1
|
||||
%t4 = trunc i133 %t3 to i100
|
||||
br label %BB3
|
||||
BB2:
|
||||
%f1 = or i133 -1, %A
|
||||
%f2 = lshr i133 %f1, 33
|
||||
%f3 = trunc i133 %f2 to i100
|
||||
br label %BB3
|
||||
BB3:
|
||||
%Ret = phi i100 [%t4, %BB1], [%f3, %BB2]
|
||||
ret i100 %Ret
|
||||
}
|
24
test/Transforms/SCCP/apint-bigarray.ll
Normal file
24
test/Transforms/SCCP/apint-bigarray.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep '%X'
|
||||
|
||||
@G = global [1000000 x i10000] zeroinitializer
|
||||
|
||||
define internal i10000* @test(i10000 %Arg) {
|
||||
%X = getelementptr [1000000 x i10000]* @G, i32 0, i32 999
|
||||
store i10000 %Arg, i10000* %X
|
||||
ret i10000* %X
|
||||
}
|
||||
|
||||
define i10000 @caller()
|
||||
{
|
||||
%Y = call i10000* @test(i10000 -1)
|
||||
%Z = load i10000* %Y
|
||||
ret i10000 %Z
|
||||
}
|
||||
|
||||
define i10000 @caller2()
|
||||
{
|
||||
%Y = call i10000* @test(i10000 1)
|
||||
%Z = load i10000* %Y
|
||||
ret i10000 %Z
|
||||
}
|
10
test/Transforms/SCCP/apint-bigint.ll
Normal file
10
test/Transforms/SCCP/apint-bigint.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep xor
|
||||
|
||||
define i11129 @test1() {
|
||||
%B = shl i11129 1, 11128
|
||||
%C = sub i11129 %B, 1
|
||||
%D = xor i11129 %B, %C
|
||||
|
||||
ret i11129 %D
|
||||
}
|
19
test/Transforms/SCCP/apint-bigint2.ll
Normal file
19
test/Transforms/SCCP/apint-bigint2.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep load
|
||||
|
||||
@Y = constant [6 x i101] [ i101 12, i101 123456789000000, i101 -12,
|
||||
i101 -123456789000000, i101 0,i101 9123456789000000]
|
||||
|
||||
define i101 @array()
|
||||
{
|
||||
Head:
|
||||
%A = getelementptr [6 x i101]* @Y, i32 0, i32 1
|
||||
%B = load i101* %A
|
||||
%D = and i101 %B, 1
|
||||
%DD = or i101 %D, 1
|
||||
%E = trunc i101 %DD to i32
|
||||
%F = getelementptr [6 x i101]* @Y, i32 0, i32 %E
|
||||
%G = load i101* %F
|
||||
|
||||
ret i101 %G
|
||||
}
|
23
test/Transforms/SCCP/apint-ipsccp1.ll
Normal file
23
test/Transforms/SCCP/apint-ipsccp1.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | grep -v 'ret i512 undef' | grep 'ret i8 2'
|
||||
|
||||
define internal i512 @test(i1 %B) {
|
||||
br i1 %B, label %BB1, label %BB2
|
||||
BB1:
|
||||
%Val = add i512 0, 1
|
||||
br label %BB3
|
||||
BB2:
|
||||
br label %BB3
|
||||
BB3:
|
||||
%Ret = phi i512 [%Val, %BB1], [2, %BB2]
|
||||
ret i512 %Ret
|
||||
}
|
||||
|
||||
define i8 @caller()
|
||||
{
|
||||
%t1 = and i2 2, 1
|
||||
%t11 = trunc i2 %t1 to i1
|
||||
%t2 = call i512 @test(i1 %t11)
|
||||
%t3 = trunc i512 %t2 to i8
|
||||
ret i8 %t3
|
||||
}
|
||||
|
21
test/Transforms/SCCP/apint-ipsccp2.ll
Normal file
21
test/Transforms/SCCP/apint-ipsccp2.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | grep -v 'ret i101 0' | \
|
||||
; RUN: grep -v 'ret i101 undef' | not grep ret
|
||||
|
||||
|
||||
|
||||
define internal i101 @bar(i101 %A) {
|
||||
%x = icmp eq i101 %A, 0
|
||||
br i1 %x, label %T, label %F
|
||||
T:
|
||||
%B = call i101 @bar(i101 0)
|
||||
ret i101 0
|
||||
F: ; unreachable
|
||||
%C = call i101 @bar(i101 1)
|
||||
ret i101 %C
|
||||
}
|
||||
|
||||
define i101 @foo() {
|
||||
%X = call i101 @bar(i101 0)
|
||||
ret i101 %X
|
||||
}
|
24
test/Transforms/SCCP/apint-ipsccp3.ll
Normal file
24
test/Transforms/SCCP/apint-ipsccp3.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep global
|
||||
|
||||
@G = internal global i66 undef
|
||||
|
||||
|
||||
|
||||
define void @foo() {
|
||||
%X = load i66* @G
|
||||
store i66 %X, i66* @G
|
||||
ret void
|
||||
}
|
||||
|
||||
define i66 @bar() {
|
||||
%V = load i66* @G
|
||||
%C = icmp eq i66 %V, 17
|
||||
br i1 %C, label %T, label %F
|
||||
T:
|
||||
store i66 17, i66* @G
|
||||
ret i66 %V
|
||||
F:
|
||||
store i66 123, i66* @G
|
||||
ret i66 0
|
||||
}
|
51
test/Transforms/SCCP/apint-ipsccp4.ll
Normal file
51
test/Transforms/SCCP/apint-ipsccp4.ll
Normal file
@ -0,0 +1,51 @@
|
||||
; This test makes sure that these instructions are properly constant propagated.
|
||||
;
|
||||
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep load
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep add
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep phi
|
||||
|
||||
|
||||
@Y = constant [2 x { i212, float }] [ { i212, float } { i212 12, float 1.0 },
|
||||
{ i212, float } { i212 37, float 2.0 } ]
|
||||
|
||||
define internal float @test2() {
|
||||
%A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 1, i32 1
|
||||
%B = load float* %A
|
||||
ret float %B
|
||||
}
|
||||
|
||||
define internal float @test3() {
|
||||
%A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 0, i32 1
|
||||
%B = load float* %A
|
||||
ret float %B
|
||||
}
|
||||
|
||||
define internal float @test()
|
||||
{
|
||||
%A = call float @test2()
|
||||
%B = call float @test3()
|
||||
|
||||
%E = fdiv float %B, %A
|
||||
ret float %E
|
||||
}
|
||||
|
||||
define float @All()
|
||||
{
|
||||
%A = call float @test()
|
||||
%B = fcmp oge float %A, 1.0
|
||||
br i1 %B, label %T, label %F
|
||||
T:
|
||||
%C = add float %A, 1.0
|
||||
br label %exit
|
||||
F:
|
||||
%D = add float %A, 2.0
|
||||
br label %exit
|
||||
exit:
|
||||
%E = phi float [%C, %T], [%D, %F]
|
||||
ret float %E
|
||||
}
|
||||
|
||||
|
||||
|
38
test/Transforms/SCCP/apint-load.ll
Normal file
38
test/Transforms/SCCP/apint-load.ll
Normal file
@ -0,0 +1,38 @@
|
||||
; This test makes sure that these instructions are properly constant propagated.
|
||||
;
|
||||
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep load
|
||||
; RUN: llvm-as < %s | opt -ipsccp | llvm-dis | not grep fdiv
|
||||
|
||||
@X = constant i212 42
|
||||
@Y = constant [2 x { i212, float }] [ { i212, float } { i212 12, float 1.0 },
|
||||
{ i212, float } { i212 37, float 1.2312 } ]
|
||||
define i212 @test1() {
|
||||
%B = load i212* @X
|
||||
ret i212 %B
|
||||
}
|
||||
|
||||
define internal float @test2() {
|
||||
%A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 1, i32 1
|
||||
%B = load float* %A
|
||||
ret float %B
|
||||
}
|
||||
|
||||
define internal i212 @test3() {
|
||||
%A = getelementptr [2 x { i212, float}]* @Y, i32 0, i32 0, i32 0
|
||||
%B = load i212* %A
|
||||
ret i212 %B
|
||||
}
|
||||
|
||||
define float @All()
|
||||
{
|
||||
%A = call float @test2()
|
||||
%B = call i212 @test3()
|
||||
%C = mul i212 %B, -1234567
|
||||
%D = sitofp i212 %C to float
|
||||
%E = fdiv float %A, %D
|
||||
ret float %E
|
||||
}
|
||||
|
||||
|
20
test/Transforms/SCCP/apint-phi.ll
Normal file
20
test/Transforms/SCCP/apint-phi.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep phi
|
||||
|
||||
define i999 @test(i999%A, i1 %c) {
|
||||
bb1:
|
||||
br label %BB2
|
||||
BB2:
|
||||
%V = phi i999 [2, %bb1], [%A, %BB4]
|
||||
br label %BB3
|
||||
|
||||
BB3:
|
||||
%E = trunc i999 %V to i1
|
||||
%F = and i1 %E, %c
|
||||
br i1 %F, label %BB4, label %BB5
|
||||
BB4:
|
||||
br label %BB2
|
||||
|
||||
BB5:
|
||||
ret i999 %V
|
||||
}
|
22
test/Transforms/SCCP/apint-select.ll
Normal file
22
test/Transforms/SCCP/apint-select.ll
Normal file
@ -0,0 +1,22 @@
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis -o /dev/null -f &&
|
||||
; RUN: llvm-as < %s | opt -sccp | llvm-dis | not grep select
|
||||
|
||||
@A = constant i32 10
|
||||
|
||||
define i712 @test1() {
|
||||
%P = getelementptr i32* @A, i32 0
|
||||
%B = ptrtoint i32* %P to i64
|
||||
%BB = and i64 %B, undef
|
||||
%C = icmp sge i64 %BB, 0
|
||||
%X = select i1 %C, i712 0, i712 1
|
||||
ret i712 %X
|
||||
}
|
||||
|
||||
|
||||
|
||||
define i712 @test2(i1 %C) {
|
||||
%X = select i1 %C, i712 0, i712 undef
|
||||
ret i712 %X
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user