diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
commit | 30815c536baacc07e925f0aef23a5395883173dc (patch) | |
tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /test/Transforms/LICM | |
parent | 411bd29eea3c360d5b48a18a17b5e87f5671af0e (diff) | |
download | src-30815c536baacc07e925f0aef23a5395883173dc.tar.gz src-30815c536baacc07e925f0aef23a5395883173dc.zip |
Vendor import of llvm release_30 branch r142614:vendor/llvm/llvm-r142614
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=226584
svn path=/vendor/llvm/llvm-r142614/; revision=226585; tag=vendor/llvm/llvm-r142614
Diffstat (limited to 'test/Transforms/LICM')
-rw-r--r-- | test/Transforms/LICM/2007-05-22-VolatileSink.ll | 2 | ||||
-rw-r--r-- | test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll | 2 | ||||
-rw-r--r-- | test/Transforms/LICM/atomics.ll | 79 | ||||
-rw-r--r-- | test/Transforms/LICM/scalar-promote-memmodel.ll | 37 | ||||
-rw-r--r-- | test/Transforms/LICM/scalar_promote.ll | 2 |
5 files changed, 119 insertions, 3 deletions
diff --git a/test/Transforms/LICM/2007-05-22-VolatileSink.ll b/test/Transforms/LICM/2007-05-22-VolatileSink.ll index c12e13beccf5..17383c2ebb63 100644 --- a/test/Transforms/LICM/2007-05-22-VolatileSink.ll +++ b/test/Transforms/LICM/2007-05-22-VolatileSink.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -licm -S | grep {volatile store} +; RUN: opt < %s -licm -S | grep {store volatile} ; PR1435 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" target triple = "i686-apple-darwin8" diff --git a/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll b/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll index 5774f587f1c3..fd114f4ccc11 100644 --- a/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll +++ b/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll @@ -15,7 +15,7 @@ for.body4.lr.ph: br label %for.body4 ; CHECK: for.body4: -; CHECK: volatile load i16* @g_39 +; CHECK: load volatile i16* @g_39 for.body4: %l_612.11 = phi i32* [ undef, %for.body4.lr.ph ], [ %call19, %for.body4 ] diff --git a/test/Transforms/LICM/atomics.ll b/test/Transforms/LICM/atomics.ll new file mode 100644 index 000000000000..3902152ba2e5 --- /dev/null +++ b/test/Transforms/LICM/atomics.ll @@ -0,0 +1,79 @@ +; RUN: opt < %s -S -basicaa -licm | FileCheck %s + +; Check that we can hoist unordered loads +define i32 @test1(i32* nocapture %y) nounwind uwtable ssp { +entry: + br label %loop + +loop: + %i = phi i32 [ %inc, %loop ], [ 0, %entry ] + %val = load atomic i32* %y unordered, align 4 + %inc = add nsw i32 %i, 1 + %exitcond = icmp eq i32 %inc, %val + br i1 %exitcond, label %end, label %loop + +end: + ret i32 %val +; CHECK: define i32 @test1( +; CHECK: load atomic +; CHECK-NEXT: br label %loop +} + +; Check that we don't sink/hoist monotonic loads +; (Strictly speaking, it's not forbidden, but it's supposed to be possible to +; use monotonic for spinlock-like constructs.) +define i32 @test2(i32* nocapture %y) nounwind uwtable ssp { +entry: + br label %loop + +loop: + %val = load atomic i32* %y monotonic, align 4 + %exitcond = icmp ne i32 %val, 0 + br i1 %exitcond, label %end, label %loop + +end: + ret i32 %val +; CHECK: define i32 @test2( +; CHECK: load atomic +; CHECK-NEXT: %exitcond = icmp ne +; CHECK-NEXT: br i1 %exitcond, label %end, label %loop +} + +; Check that we hoist unordered around monotonic. +; (The noalias shouldn't be necessary in theory, but LICM isn't quite that +; smart yet.) +define i32 @test3(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp { +entry: + br label %loop + +loop: + %vala = load atomic i32* %y monotonic, align 4 + %valb = load atomic i32* %x unordered, align 4 + %exitcond = icmp ne i32 %vala, %valb + br i1 %exitcond, label %end, label %loop + +end: + ret i32 %vala +; CHECK: define i32 @test3( +; CHECK: load atomic i32* %x unordered +; CHECK-NEXT: br label %loop +} + +; Don't try to "sink" unordered stores yet; it is legal, but the machinery +; isn't there. +define i32 @test4(i32* nocapture noalias %x, i32* nocapture %y) nounwind uwtable ssp { +entry: + br label %loop + +loop: + %vala = load atomic i32* %y monotonic, align 4 + store atomic i32 %vala, i32* %x unordered, align 4 + %exitcond = icmp ne i32 %vala, 0 + br i1 %exitcond, label %end, label %loop + +end: + ret i32 %vala +; CHECK: define i32 @test4( +; CHECK: load atomic i32* %y monotonic +; CHECK-NEXT: store atomic +} diff --git a/test/Transforms/LICM/scalar-promote-memmodel.ll b/test/Transforms/LICM/scalar-promote-memmodel.ll new file mode 100644 index 000000000000..23d70f51351a --- /dev/null +++ b/test/Transforms/LICM/scalar-promote-memmodel.ll @@ -0,0 +1,37 @@ +; RUN: opt < %s -basicaa -licm -S | FileCheck %s + +; Make sure we don't hoist a conditionally-executed store out of the loop; +; it would violate the concurrency memory model + +@g = common global i32 0, align 4 + +define void @bar(i32 %n, i32 %b) nounwind uwtable ssp { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc5, %for.inc ] + %cmp = icmp slt i32 %i.0, %n + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %tobool = icmp eq i32 %b, 0 + br i1 %tobool, label %for.inc, label %if.then + +if.then: ; preds = %for.body + %tmp3 = load i32* @g, align 4 + %inc = add nsw i32 %tmp3, 1 + store i32 %inc, i32* @g, align 4 + br label %for.inc + +; CHECK: load i32* +; CHECK-NEXT: add +; CHECK-NEXT: store i32 + +for.inc: ; preds = %for.body, %if.then + %inc5 = add nsw i32 %i.0, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} diff --git a/test/Transforms/LICM/scalar_promote.ll b/test/Transforms/LICM/scalar_promote.ll index d8acdc1a3ad7..9aefc4f87eac 100644 --- a/test/Transforms/LICM/scalar_promote.ll +++ b/test/Transforms/LICM/scalar_promote.ll @@ -65,7 +65,7 @@ Loop: br i1 true, label %Out, label %Loop ; CHECK: Loop: -; CHECK-NEXT: volatile load +; CHECK-NEXT: load volatile Out: ; preds = %Loop ret void |