diff options
Diffstat (limited to 'test/Transforms/JumpThreading/thread-loads.ll')
-rw-r--r-- | test/Transforms/JumpThreading/thread-loads.ll | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/test/Transforms/JumpThreading/thread-loads.ll b/test/Transforms/JumpThreading/thread-loads.ll index f76c1ec518576..4b482cb15f9ae 100644 --- a/test/Transforms/JumpThreading/thread-loads.ll +++ b/test/Transforms/JumpThreading/thread-loads.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -jump-threading -S | FileCheck %s +; RUN: opt < %s -passes=jump-threading -S | FileCheck %s target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "i386-apple-darwin7" @@ -106,6 +107,145 @@ return: ret i32 13 } +define i32 @test4(i32* %P) { +; CHECK-LABEL: @test4( +entry: + %v0 = tail call i32 (...) @f1() + %v1 = icmp eq i32 %v0, 0 + br i1 %v1, label %bb1, label %bb + +bb: +; CHECK: bb1.thread: +; CHECK: store atomic +; CHECK: br label %bb3 + store atomic i32 42, i32* %P unordered, align 4 + br label %bb1 + +bb1: +; CHECK: bb1: +; CHECK-NOT: phi +; CHECK: load atomic + %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] + %v2 = load atomic i32, i32* %P unordered, align 4 + %v3 = icmp sgt i32 %v2, 36 + br i1 %v3, label %bb3, label %bb2 + +bb2: + %v4 = tail call i32 (...) @f2() + ret i32 %res.0 + +bb3: + ret i32 %res.0 +} + +define i32 @test5(i32* %P) { +; Negative test + +; CHECK-LABEL: @test5( +entry: + %v0 = tail call i32 (...) @f1() + %v1 = icmp eq i32 %v0, 0 + br i1 %v1, label %bb1, label %bb + +bb: +; CHECK: bb: +; CHECK-NEXT: store atomic i32 42, i32* %P release, align 4 +; CHECK-NEXT: br label %bb1 + store atomic i32 42, i32* %P release, align 4 + br label %bb1 + +bb1: +; CHECK: bb1: +; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] +; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 +; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 +; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 + + %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] + %v2 = load atomic i32, i32* %P acquire, align 4 + %v3 = icmp sgt i32 %v2, 36 + br i1 %v3, label %bb3, label %bb2 + +bb2: + %v4 = tail call i32 (...) @f2() + ret i32 %res.0 + +bb3: + ret i32 %res.0 +} + +define i32 @test6(i32* %P) { +; Negative test + +; CHECK-LABEL: @test6( +entry: + %v0 = tail call i32 (...) @f1() + %v1 = icmp eq i32 %v0, 0 + br i1 %v1, label %bb1, label %bb + +bb: +; CHECK: bb: +; CHECK-NEXT: store i32 42, i32* %P +; CHECK-NEXT: br label %bb1 + store i32 42, i32* %P + br label %bb1 + +bb1: +; CHECK: bb1: +; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] +; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 +; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 +; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 + + %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] + %v2 = load atomic i32, i32* %P acquire, align 4 + %v3 = icmp sgt i32 %v2, 36 + br i1 %v3, label %bb3, label %bb2 + +bb2: + %v4 = tail call i32 (...) @f2() + ret i32 %res.0 + +bb3: + ret i32 %res.0 +} + +define i32 @test7(i32* %P) { +; Negative test + +; CHECK-LABEL: @test7( +entry: + %v0 = tail call i32 (...) @f1() + %v1 = icmp eq i32 %v0, 0 + br i1 %v1, label %bb1, label %bb + +bb: +; CHECK: bb: +; CHECK-NEXT: %val = load i32, i32* %P +; CHECK-NEXT: br label %bb1 + %val = load i32, i32* %P + br label %bb1 + +bb1: +; CHECK: bb1: +; CHECK-NEXT: %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] +; CHECK-NEXT: %v2 = load atomic i32, i32* %P acquire, align 4 +; CHECK-NEXT: %v3 = icmp sgt i32 %v2, 36 +; CHECK-NEXT: br i1 %v3, label %bb3, label %bb2 + + %res.0 = phi i32 [ 1, %bb ], [ 0, %entry ] + %v2 = load atomic i32, i32* %P acquire, align 4 + %v3 = icmp sgt i32 %v2, 36 + br i1 %v3, label %bb3, label %bb2 + +bb2: + %v4 = tail call i32 (...) @f2() + ret i32 %res.0 + +bb3: + ret i32 %res.0 +} + !0 = !{!3, !3, i64 0} !1 = !{!"omnipotent char", !2} !2 = !{!"Simple C/C++ TBAA", null} |