diff options
Diffstat (limited to 'test/Transforms/ConstProp')
24 files changed, 281 insertions, 43 deletions
diff --git a/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll b/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll index 1a0845c52ac08..15a6211893826 100644 --- a/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll +++ b/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll @@ -1,6 +1,6 @@ ; Make sure that the constant propogator doesn't divide by zero! ; -; RUN: llvm-as < %s | opt -constprop +; RUN: opt < %s -constprop ; define i32 @test() { diff --git a/test/Transforms/ConstProp/2002-05-03-NotOperator.ll b/test/Transforms/ConstProp/2002-05-03-NotOperator.ll index 7a281aa04b67e..d9cd67406b06c 100644 --- a/test/Transforms/ConstProp/2002-05-03-NotOperator.ll +++ b/test/Transforms/ConstProp/2002-05-03-NotOperator.ll @@ -4,7 +4,7 @@ ; Fix #2: The unary not instruction now no longer exists. Change to xor. -; RUN: llvm-as < $test | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: not grep {i32 0} define i32 @test1() { diff --git a/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll b/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll index 781d796506c85..dd24d965620ce 100644 --- a/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll +++ b/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll @@ -1,6 +1,6 @@ ; SetCC on boolean values was not implemented! -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | \ +; RUN: opt < %s -constprop -die -S | \ ; RUN: not grep set define i1 @test1() { diff --git a/test/Transforms/ConstProp/2003-05-12-DivideError.ll b/test/Transforms/ConstProp/2003-05-12-DivideError.ll index a3f239f95bd41..2708dce9852dc 100644 --- a/test/Transforms/ConstProp/2003-05-12-DivideError.ll +++ b/test/Transforms/ConstProp/2003-05-12-DivideError.ll @@ -1,6 +1,6 @@ ; Make sure that the constant propagator doesn't cause a sigfpe ; -; RUN: llvm-as < %s | opt -constprop +; RUN: opt < %s -constprop ; define i32 @test() { diff --git a/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll b/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll index 9ffbcd1b0ce1a..0b44b99f6a95d 100644 --- a/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll +++ b/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: not grep {ret i1 false} @b = external global [2 x { }] ; <[2 x { }]*> [#uses=2] diff --git a/test/Transforms/ConstProp/2006-11-30-vector-cast.ll b/test/Transforms/ConstProp/2006-11-30-vector-cast.ll index 812cbcfa6277a..be76783e8b73b 100644 --- a/test/Transforms/ConstProp/2006-11-30-vector-cast.ll +++ b/test/Transforms/ConstProp/2006-11-30-vector-cast.ll @@ -1,6 +1,6 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: grep {i32 -1} -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: not grep zeroinitializer define <4 x i32> @test() { diff --git a/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll b/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll index 889ef56bf9c6e..e46a875a7cfad 100644 --- a/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll +++ b/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | \ +; RUN: opt < %s -instcombine -S | \ ; RUN: grep {ret i1 false} define i1 @test() { %X = trunc i32 320 to i1 ; <i1> [#uses=1] diff --git a/test/Transforms/ConstProp/2006-12-01-bool-casts.ll b/test/Transforms/ConstProp/2006-12-01-bool-casts.ll index dd1e46d8c6fcf..3c06693b100df 100644 --- a/test/Transforms/ConstProp/2006-12-01-bool-casts.ll +++ b/test/Transforms/ConstProp/2006-12-01-bool-casts.ll @@ -1,6 +1,6 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: grep {ret i32 -1} -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: grep {ret i32 1} define i32 @test1() { diff --git a/test/Transforms/ConstProp/2007-02-05-BitCast.ll b/test/Transforms/ConstProp/2007-02-05-BitCast.ll index a1d7c3e0377c6..ebe3d21806b7d 100644 --- a/test/Transforms/ConstProp/2007-02-05-BitCast.ll +++ b/test/Transforms/ConstProp/2007-02-05-BitCast.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | grep 1065353216 +; RUN: opt < %s -constprop -S | grep 1065353216 define i32 @test() { %A = bitcast float 1.000000e+00 to i32 ; <i32> [#uses=1] diff --git a/test/Transforms/ConstProp/2007-11-23-cttz.ll b/test/Transforms/ConstProp/2007-11-23-cttz.ll index 995ce2febf871..37cda303713b3 100644 --- a/test/Transforms/ConstProp/2007-11-23-cttz.ll +++ b/test/Transforms/ConstProp/2007-11-23-cttz.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | grep {ret i13 13} +; RUN: opt < %s -constprop -S | grep {ret i13 13} ; PR1816 declare i13 @llvm.cttz.i13(i13) diff --git a/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll b/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll index 4c71463204850..fd5495445b795 100644 --- a/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll +++ b/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll @@ -1,28 +1,28 @@ -; RUN: llvm-as < %s | opt -constprop -disable-output +; RUN: opt < %s -constprop -disable-output ; PR2529 -define <4 x i32> @test1(i32 %argc, i8** %argv) { +define <4 x i1> @test1(i32 %argc, i8** %argv) { entry: - %foo = vicmp slt <4 x i32> undef, <i32 14, i32 undef, i32 undef, i32 undef> - ret <4 x i32> %foo + %foo = icmp slt <4 x i32> undef, <i32 14, i32 undef, i32 undef, i32 undef> + ret <4 x i1> %foo } -define <4 x i32> @test2(i32 %argc, i8** %argv) { +define <4 x i1> @test2(i32 %argc, i8** %argv) { entry: - %foo = vicmp slt <4 x i32> <i32 undef, i32 undef, i32 undef, i32 + %foo = icmp slt <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, <i32 undef, i32 undef, i32 undef, i32 undef> - ret <4 x i32> %foo + ret <4 x i1> %foo } -define <4 x i32> @test3() { - %foo = vfcmp ueq <4 x float> <float 0.0, float 0.0, float 0.0, float +define <4 x i1> @test3() { + %foo = fcmp ueq <4 x float> <float 0.0, float 0.0, float 0.0, float undef>, <float 1.0, float 1.0, float 1.0, float undef> - ret <4 x i32> %foo + ret <4 x i1> %foo } -define <4 x i32> @test4() { - %foo = vfcmp ueq <4 x float> <float 0.0, float 0.0, float 0.0, float 0.0>, <float 1.0, float 1.0, float 1.0, float 0.0> +define <4 x i1> @test4() { + %foo = fcmp ueq <4 x float> <float 0.0, float 0.0, float 0.0, float 0.0>, <float 1.0, float 1.0, float 1.0, float 0.0> - ret <4 x i32> %foo + ret <4 x i1> %foo } diff --git a/test/Transforms/ConstProp/2009-09-01-GEP-Crash.ll b/test/Transforms/ConstProp/2009-09-01-GEP-Crash.ll new file mode 100644 index 0000000000000..fc7ff905ecb02 --- /dev/null +++ b/test/Transforms/ConstProp/2009-09-01-GEP-Crash.ll @@ -0,0 +1,24 @@ +; RUN: opt < %s -constprop | llvm-dis +; PR4848 +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-unknown-linux-gnu" + +%0 = type { %struct.anon } +%1 = type { %0, %2, [24 x i8] } +%2 = type <{ %3, %3 }> +%3 = type { %struct.hrtimer_cpu_base*, i32, %struct.rb_root, %struct.rb_node*, %struct.pgprot, i64 ()*, [16 x i8] } +%struct.anon = type { } +%struct.hrtimer_clock_base = type { %struct.hrtimer_cpu_base*, i32, %struct.rb_root, %struct.rb_node*, %struct.pgprot, i64 ()*, %struct.pgprot, %struct.pgprot } +%struct.hrtimer_cpu_base = type { %0, [2 x %struct.hrtimer_clock_base], %struct.pgprot, i32, i64 } +%struct.pgprot = type { i64 } +%struct.rb_node = type { i64, %struct.rb_node*, %struct.rb_node* } +%struct.rb_root = type { %struct.rb_node* } + +@per_cpu__hrtimer_bases = external global %1, align 8 ; <%1*> [#uses=1] + +define void @init_hrtimers_cpu(i32 %cpu) nounwind noredzone section ".cpuinit.text" { +entry: + %tmp3 = getelementptr %struct.hrtimer_cpu_base* bitcast (%1* @per_cpu__hrtimer_bases to %struct.hrtimer_cpu_base*), i32 0, i32 0 ; <%0*> [#uses=1] + %tmp5 = bitcast %0* %tmp3 to i8* ; <i8*> [#uses=0] + unreachable +} diff --git a/test/Transforms/ConstProp/2009-09-19-ConstFold-i1-ConstExpr.ll b/test/Transforms/ConstProp/2009-09-19-ConstFold-i1-ConstExpr.ll new file mode 100644 index 0000000000000..8d92c3fba4bf8 --- /dev/null +++ b/test/Transforms/ConstProp/2009-09-19-ConstFold-i1-ConstExpr.ll @@ -0,0 +1,41 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s + +@X = external global i8 +@Y = external global i8 +@Z = external global i8 + +@A = global i1 add (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @A = global i1 xor (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) ; <i1*> [#uses=0] +@B = global i1 sub (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @B = global i1 xor (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) ; <i1*> [#uses=0] +@C = global i1 mul (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @C = global i1 and (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) ; <i1*> [#uses=0] + +@D = global i1 sdiv (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @D = global i1 icmp ult (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@E = global i1 udiv (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @E = global i1 icmp ult (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@F = global i1 srem (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @F = global i1 false ; <i1*> [#uses=0] +@G = global i1 urem (i1 icmp ult (i8* @X, i8* @Y), i1 icmp ult (i8* @X, i8* @Z)) +; CHECK: @G = global i1 false ; <i1*> [#uses=0] + +@H = global i1 icmp ule (i32* bitcast (i8* @X to i32*), i32* bitcast (i8* @Y to i32*)) +; CHECK: @H = global i1 icmp ule (i8* @X, i8* @Y) ; <i1*> [#uses=0] + +@I = global i1 xor (i1 icmp ult (i8* @X, i8* @Y), i1 false) +; CHECK: @I = global i1 icmp ult (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@J = global i1 xor (i1 icmp ult (i8* @X, i8* @Y), i1 true) +; CHECK: @J = global i1 icmp uge (i8* @X, i8* @Y) ; <i1*> [#uses=0] + +@K = global i1 icmp eq (i1 icmp ult (i8* @X, i8* @Y), i1 false) +; CHECK: @K = global i1 icmp uge (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@L = global i1 icmp eq (i1 icmp ult (i8* @X, i8* @Y), i1 true) +; CHECK: @L = global i1 icmp ult (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@M = global i1 icmp ne (i1 icmp ult (i8* @X, i8* @Y), i1 true) +; CHECK: @M = global i1 icmp uge (i8* @X, i8* @Y) ; <i1*> [#uses=0] +@N = global i1 icmp ne (i1 icmp ult (i8* @X, i8* @Y), i1 false) +; CHECK: @N = global i1 icmp ult (i8* @X, i8* @Y) ; <i1*> [#uses=0] + +@O = global i1 icmp eq (i32 zext (i1 icmp ult (i8* @X, i8* @Y) to i32), i32 0) +; CHECK: @O = global i1 icmp uge (i8* @X, i8* @Y) ; <i1*> [#uses=0] diff --git a/test/Transforms/ConstProp/basictest.ll b/test/Transforms/ConstProp/basictest.ll index 56892d93186ff..2edc55dbc1f05 100644 --- a/test/Transforms/ConstProp/basictest.ll +++ b/test/Transforms/ConstProp/basictest.ll @@ -1,20 +1,21 @@ +; RUN: opt < %s -constprop -die -S | FileCheck %s + ; This is a basic sanity check for constant propogation. The add instruction ; should be eliminated. - -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | not grep add - -define i32 @test(i1 %B) { +define i32 @test1(i1 %B) { br i1 %B, label %BB1, label %BB2 -BB1: ; preds = %0 - %Val = add i32 0, 0 ; <i32> [#uses=1] +BB1: + %Val = add i32 0, 0 br label %BB3 -BB2: ; preds = %0 +BB2: br label %BB3 -BB3: ; preds = %BB2, %BB1 - %Ret = phi i32 [ %Val, %BB1 ], [ 1, %BB2 ] ; <i32> [#uses=1] +BB3: +; CHECK: @test1 +; CHECK: %Ret = phi i32 [ 0, %BB1 ], [ 1, %BB2 ] + %Ret = phi i32 [ %Val, %BB1 ], [ 1, %BB2 ] ret i32 %Ret } diff --git a/test/Transforms/ConstProp/bitcast2.ll b/test/Transforms/ConstProp/bitcast2.ll index 66def7f49da23..5c5eab1879c3a 100644 --- a/test/Transforms/ConstProp/bitcast2.ll +++ b/test/Transforms/ConstProp/bitcast2.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep bitcast +; RUN: opt < %s -instcombine -S | not grep bitcast ; PR2165 define <1 x i64> @test() { diff --git a/test/Transforms/ConstProp/bswap.ll b/test/Transforms/ConstProp/bswap.ll index 49758271046e8..9fce309b7887f 100644 --- a/test/Transforms/ConstProp/bswap.ll +++ b/test/Transforms/ConstProp/bswap.ll @@ -1,6 +1,6 @@ ; bswap should be constant folded when it is passed a constant argument -; RUN: llvm-as < %s | opt -constprop | llvm-dis | not grep call +; RUN: opt < %s -constprop -S | not grep call declare i16 @llvm.bswap.i16(i16) diff --git a/test/Transforms/ConstProp/calls.ll b/test/Transforms/ConstProp/calls.ll index c573e565fc83b..3c266fe62ed88 100644 --- a/test/Transforms/ConstProp/calls.ll +++ b/test/Transforms/ConstProp/calls.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | not grep call +; RUN: opt < %s -constprop -S | not grep call declare double @cos(double) diff --git a/test/Transforms/ConstProp/div-zero.ll b/test/Transforms/ConstProp/div-zero.ll index 166c643dcc999..f78a34fe703d6 100644 --- a/test/Transforms/ConstProp/div-zero.ll +++ b/test/Transforms/ConstProp/div-zero.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 0} +; RUN: opt < %s -instcombine -S | grep {ret i32 0} ; PR4424 declare void @ext() diff --git a/test/Transforms/ConstProp/float-to-ptr-cast.ll b/test/Transforms/ConstProp/float-to-ptr-cast.ll index cbf84f54f0a2d..d8eb3e8b652c8 100644 --- a/test/Transforms/ConstProp/float-to-ptr-cast.ll +++ b/test/Transforms/ConstProp/float-to-ptr-cast.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -constprop | llvm-dis | \ +; RUN: opt < %s -constprop -S | \ ; RUN: grep -F {ret i32* null} | count 2 define i32* @test1() { diff --git a/test/Transforms/ConstProp/logicaltest.ll b/test/Transforms/ConstProp/logicaltest.ll index 81bdb950e9fcb..7a90a7199f8da 100644 --- a/test/Transforms/ConstProp/logicaltest.ll +++ b/test/Transforms/ConstProp/logicaltest.ll @@ -1,6 +1,6 @@ ; Ensure constant propogation of logical instructions is working correctly. -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | \ +; RUN: opt < %s -constprop -die -S | \ ; RUN: not egrep {and|or|xor} define i32 @test1() { diff --git a/test/Transforms/ConstProp/nottest.ll b/test/Transforms/ConstProp/nottest.ll index 41ea1b3873046..799cecaae60a9 100644 --- a/test/Transforms/ConstProp/nottest.ll +++ b/test/Transforms/ConstProp/nottest.ll @@ -1,6 +1,6 @@ ; Ensure constant propogation of 'not' instructions is working correctly. -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | not grep xor +; RUN: opt < %s -constprop -die -S | not grep xor define i32 @test1() { %R = xor i32 4, -1 ; <i32> [#uses=1] diff --git a/test/Transforms/ConstProp/overflow-ops.ll b/test/Transforms/ConstProp/overflow-ops.ll new file mode 100644 index 0000000000000..1547a4d0f5b81 --- /dev/null +++ b/test/Transforms/ConstProp/overflow-ops.ll @@ -0,0 +1,172 @@ +; RUN: opt < %s -constprop -S | FileCheck %s + +%i8i1 = type {i8, i1} + +;;----------------------------- +;; uadd +;;----------------------------- + +define {i8, i1} @uadd_1() nounwind { +entry: + %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 42, i8 100) + ret {i8, i1} %t + +; CHECK: @uadd_1 +; CHECK: ret %i8i1 { i8 -114, i1 false } +} + +define {i8, i1} @uadd_2() nounwind { +entry: + %t = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 142, i8 120) + ret {i8, i1} %t + +; CHECK: @uadd_2 +; CHECK: ret %i8i1 { i8 6, i1 true } +} + +;;----------------------------- +;; usub +;;----------------------------- + +define {i8, i1} @usub_1() nounwind { +entry: + %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 2) + ret {i8, i1} %t + +; CHECK: @usub_1 +; CHECK: ret %i8i1 { i8 2, i1 false } +} + +define {i8, i1} @usub_2() nounwind { +entry: + %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 4, i8 6) + ret {i8, i1} %t + +; CHECK: @usub_2 +; CHECK: ret %i8i1 { i8 -2, i1 true } +} + +;;----------------------------- +;; sadd +;;----------------------------- + +define {i8, i1} @sadd_1() nounwind { +entry: + %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 42, i8 2) + ret {i8, i1} %t + +; CHECK: @sadd_1 +; CHECK: ret %i8i1 { i8 44, i1 false } +} + +define {i8, i1} @sadd_2() nounwind { +entry: + %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 120, i8 10) + ret {i8, i1} %t + +; CHECK: @sadd_2 +; CHECK: ret %i8i1 { i8 -126, i1 true } +} + +define {i8, i1} @sadd_3() nounwind { +entry: + %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 10) + ret {i8, i1} %t + +; CHECK: @sadd_3 +; CHECK: ret %i8i1 { i8 -110, i1 false } +} + +define {i8, i1} @sadd_4() nounwind { +entry: + %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 -120, i8 -10) + ret {i8, i1} %t + +; CHECK: @sadd_4 +; CHECK: ret %i8i1 { i8 126, i1 true } +} + +define {i8, i1} @sadd_5() nounwind { +entry: + %t = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 2, i8 -10) + ret {i8, i1} %t + +; CHECK: @sadd_5 +; CHECK: ret %i8i1 { i8 -8, i1 false } +} + + +;;----------------------------- +;; ssub +;;----------------------------- + +define {i8, i1} @ssub_1() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 2) + ret {i8, i1} %t + +; CHECK: @ssub_1 +; CHECK: ret %i8i1 { i8 2, i1 false } +} + +define {i8, i1} @ssub_2() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 4, i8 6) + ret {i8, i1} %t + +; CHECK: @ssub_2 +; CHECK: ret %i8i1 { i8 -2, i1 false } +} + +define {i8, i1} @ssub_3() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 120) + ret {i8, i1} %t + +; CHECK: @ssub_3 +; CHECK: ret %i8i1 { i8 126, i1 true } +} + +define {i8, i1} @ssub_3b() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -10, i8 10) + ret {i8, i1} %t + +; CHECK: @ssub_3b +; CHECK: ret %i8i1 { i8 -20, i1 false } +} + +define {i8, i1} @ssub_4() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 120, i8 -10) + ret {i8, i1} %t + +; CHECK: @ssub_4 +; CHECK: ret %i8i1 { i8 -126, i1 true } +} + +define {i8, i1} @ssub_4b() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 20, i8 -10) + ret {i8, i1} %t + +; CHECK: @ssub_4b +; CHECK: ret %i8i1 { i8 30, i1 false } +} + +define {i8, i1} @ssub_5() nounwind { +entry: + %t = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 -20, i8 -10) + ret {i8, i1} %t + +; CHECK: @ssub_5 +; CHECK: ret %i8i1 { i8 -10, i1 false } +} + + + +declare {i8, i1} @llvm.uadd.with.overflow.i8(i8, i8) +declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8) + +declare {i8, i1} @llvm.sadd.with.overflow.i8(i8, i8) +declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8) diff --git a/test/Transforms/ConstProp/phi.ll b/test/Transforms/ConstProp/phi.ll index 858c0becb148f..3d9e284457cf6 100644 --- a/test/Transforms/ConstProp/phi.ll +++ b/test/Transforms/ConstProp/phi.ll @@ -1,7 +1,7 @@ ; This is a basic sanity check for constant propogation. The add instruction ; should be eliminated. -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | not grep phi +; RUN: opt < %s -constprop -die -S | not grep phi define i32 @test(i1 %B) { BB0: diff --git a/test/Transforms/ConstProp/remtest.ll b/test/Transforms/ConstProp/remtest.ll index 11861a4e80933..efd2d48332a2a 100644 --- a/test/Transforms/ConstProp/remtest.ll +++ b/test/Transforms/ConstProp/remtest.ll @@ -1,6 +1,6 @@ ; Ensure constant propagation of remainder instructions is working correctly. -; RUN: llvm-as < %s | opt -constprop -die | llvm-dis | not grep rem +; RUN: opt < %s -constprop -die -S | not grep rem define i32 @test1() { %R = srem i32 4, 3 ; <i32> [#uses=1] |