diff options
Diffstat (limited to 'test/Analysis/BasicAA')
-rw-r--r-- | test/Analysis/BasicAA/2008-04-15-Byval.ll | 2 | ||||
-rw-r--r-- | test/Analysis/BasicAA/assume.ll | 23 | ||||
-rw-r--r-- | test/Analysis/BasicAA/cs-cs.ll | 15 | ||||
-rw-r--r-- | test/Analysis/BasicAA/gcsetest.ll | 4 | ||||
-rw-r--r-- | test/Analysis/BasicAA/modref.ll | 34 | ||||
-rw-r--r-- | test/Analysis/BasicAA/phi-aa.ll | 1 | ||||
-rw-r--r-- | test/Analysis/BasicAA/zext.ll | 209 |
7 files changed, 268 insertions, 20 deletions
diff --git a/test/Analysis/BasicAA/2008-04-15-Byval.ll b/test/Analysis/BasicAA/2008-04-15-Byval.ll index 428189a..2ea0314 100644 --- a/test/Analysis/BasicAA/2008-04-15-Byval.ll +++ b/test/Analysis/BasicAA/2008-04-15-Byval.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -std-compile-opts -S | FileCheck %s +; RUN: opt < %s -O3 -S | FileCheck %s ; ModuleID = 'small2.c' 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-darwin8" diff --git a/test/Analysis/BasicAA/assume.ll b/test/Analysis/BasicAA/assume.ll new file mode 100644 index 0000000..e163b5a --- /dev/null +++ b/test/Analysis/BasicAA/assume.ll @@ -0,0 +1,23 @@ +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32" + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) #0 +declare void @llvm.assume(i1) #0 + +define void @test1(i8* %P, i8* %Q) nounwind ssp { + tail call void @llvm.assume(i1 true) + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) + ret void + +; CHECK-LABEL: Function: test1: + +; CHECK: MayAlias: i8* %P, i8* %Q +; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.assume(i1 true) +; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.assume(i1 true) +; CHECK: Both ModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) +; CHECK: Both ModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) +; CHECK: NoModRef: tail call void @llvm.assume(i1 true) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) +; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.assume(i1 true) +} + +attributes #0 = { nounwind } diff --git a/test/Analysis/BasicAA/cs-cs.ll b/test/Analysis/BasicAA/cs-cs.ll index 682e4b6..693634c 100644 --- a/test/Analysis/BasicAA/cs-cs.ll +++ b/test/Analysis/BasicAA/cs-cs.ll @@ -8,6 +8,8 @@ declare void @llvm.arm.neon.vst1.v8i16(i8*, <8 x i16>, i32) nounwind declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind +declare void @a_readonly_func(i8 *) noinline nounwind readonly + define <8 x i16> @test1(i8* %p, <8 x i16> %y) { entry: %q = getelementptr i8* %p, i64 16 @@ -218,4 +220,17 @@ define void @test5(i8* %P, i8* %Q, i8* %R) nounwind ssp { ; CHECK: Both ModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) } +define void @test6(i8* %P) nounwind ssp { + call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false) + call void @a_readonly_func(i8* %P) + ret void + +; CHECK-LABEL: Function: test6: + +; CHECK: Just Mod: Ptr: i8* %P <-> call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false) +; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P) +; CHECK: Just Mod: call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false) <-> call void @a_readonly_func(i8* %P) +; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false) +} + attributes #0 = { nounwind } diff --git a/test/Analysis/BasicAA/gcsetest.ll b/test/Analysis/BasicAA/gcsetest.ll index db557b7..64792eb 100644 --- a/test/Analysis/BasicAA/gcsetest.ll +++ b/test/Analysis/BasicAA/gcsetest.ll @@ -1,5 +1,5 @@ -; Test that GCSE uses basicaa to do alias analysis, which is capable of -; disambiguating some obvious cases. All loads should be removable in +; Test that GCSE uses basicaa to do alias analysis, which is capable of +; disambiguating some obvious cases. All loads should be removable in ; this testcase. ; RUN: opt < %s -basicaa -gvn -instcombine -dce -S | FileCheck %s diff --git a/test/Analysis/BasicAA/modref.ll b/test/Analysis/BasicAA/modref.ll index 8421faf..0d8bf71 100644 --- a/test/Analysis/BasicAA/modref.ll +++ b/test/Analysis/BasicAA/modref.ll @@ -8,20 +8,20 @@ declare void @external(i32*) define i32 @test0(i8* %P) { %A = alloca i32 call void @external(i32* %A) - + store i32 0, i32* %A - + call void @llvm.memset.p0i8.i32(i8* %P, i8 0, i32 42, i32 1, i1 false) - + %B = load i32* %A ret i32 %B - -; CHECK: @test0 + +; CHECK-LABEL: @test0 ; CHECK: ret i32 0 } define i8 @test1() { -; CHECK: @test1 +; CHECK-LABEL: @test1 %A = alloca i8 %B = alloca i8 @@ -35,7 +35,7 @@ define i8 @test1() { } define i8 @test2(i8* %P) { -; CHECK: @test2 +; CHECK-LABEL: @test2 %P2 = getelementptr i8* %P, i32 127 store i8 1, i8* %P2 ;; Not dead across memset call void @llvm.memset.p0i8.i8(i8* %P, i8 2, i8 127, i32 0, i1 false) @@ -45,12 +45,12 @@ define i8 @test2(i8* %P) { } define i8 @test2a(i8* %P) { -; CHECK: @test2 +; CHECK-LABEL: @test2 %P2 = getelementptr i8* %P, i32 126 - + ;; FIXME: DSE isn't zapping this dead store. store i8 1, i8* %P2 ;; Dead, clobbered by memset. - + call void @llvm.memset.p0i8.i8(i8* %P, i8 2, i8 127, i32 0, i1 false) %A = load i8* %P2 ret i8 %A @@ -59,11 +59,11 @@ define i8 @test2a(i8* %P) { } define void @test3(i8* %P, i8 %X) { -; CHECK: @test3 +; CHECK-LABEL: @test3 ; CHECK-NOT: store ; CHECK-NOT: %Y %Y = add i8 %X, 1 ;; Dead, because the only use (the store) is dead. - + %P2 = getelementptr i8* %P, i32 2 store i8 %Y, i8* %P2 ;; Not read by lifetime.end, should be removed. ; CHECK: store i8 2, i8* %P2 @@ -75,9 +75,9 @@ define void @test3(i8* %P, i8 %X) { } define void @test3a(i8* %P, i8 %X) { -; CHECK: @test3a +; CHECK-LABEL: @test3a %Y = add i8 %X, 1 ;; Dead, because the only use (the store) is dead. - + %P2 = getelementptr i8* %P, i32 2 store i8 %Y, i8* %P2 ; CHECK-NEXT: call void @llvm.lifetime.end @@ -95,7 +95,7 @@ define i32 @test4(i8* %P) { %tmp2 = load i32* @G1 %sub = sub i32 %tmp2, %tmp ret i32 %sub -; CHECK: @test4 +; CHECK-LABEL: @test4 ; CHECK-NOT: load ; CHECK: memset.p0i8.i32 ; CHECK-NOT: load @@ -123,7 +123,7 @@ define i8 @test6(i8* %p, i8* noalias %a) { %y = load i8* %a %z = add i8 %x, %y ret i8 %z -; CHECK: @test6 +; CHECK-LABEL: @test6 ; CHECK: load i8* %a ; CHECK-NOT: load ; CHECK: ret @@ -139,7 +139,7 @@ entry: call void @test7decl(i32* %add.ptr) %tmp = load i32* %x, align 4 ret i32 %tmp -; CHECK: @test7( +; CHECK-LABEL: @test7( ; CHECK: store i32 0 ; CHECK: call void @test7decl ; CHECK: load i32* diff --git a/test/Analysis/BasicAA/phi-aa.ll b/test/Analysis/BasicAA/phi-aa.ll index 74279e1..c1100f1 100644 --- a/test/Analysis/BasicAA/phi-aa.ll +++ b/test/Analysis/BasicAA/phi-aa.ll @@ -39,6 +39,7 @@ return: ; CHECK-LABEL: pr18068 ; CHECK: MayAlias: i32* %0, i32* %arrayidx5 +; CHECK: NoAlias: i32* %arrayidx13, i32* %arrayidx5 define i32 @pr18068(i32* %jj7, i32* %j) { entry: diff --git a/test/Analysis/BasicAA/zext.ll b/test/Analysis/BasicAA/zext.ll new file mode 100644 index 0000000..b59d16c --- /dev/null +++ b/test/Analysis/BasicAA/zext.ll @@ -0,0 +1,209 @@ +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s +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-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: test_with_zext +; CHECK: NoAlias: i8* %a, i8* %b + +define void @test_with_zext() { + %1 = tail call i8* @malloc(i64 120) + %a = getelementptr inbounds i8* %1, i64 8 + %2 = getelementptr inbounds i8* %1, i64 16 + %3 = zext i32 3 to i64 + %b = getelementptr inbounds i8* %2, i64 %3 + ret void +} + +; CHECK-LABEL: test_with_lshr +; CHECK: NoAlias: i8* %a, i8* %b + +define void @test_with_lshr(i64 %i) { + %1 = tail call i8* @malloc(i64 120) + %a = getelementptr inbounds i8* %1, i64 8 + %2 = getelementptr inbounds i8* %1, i64 16 + %3 = lshr i64 %i, 2 + %b = getelementptr inbounds i8* %2, i64 %3 + ret void +} + +; CHECK-LABEL: test_with_a_loop +; CHECK: NoAlias: i8* %a, i8* %b + +define void @test_with_a_loop(i8* %mem) { + br label %for.loop + +for.loop: + %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] + %a = getelementptr inbounds i8* %mem, i64 8 + %a.plus1 = getelementptr inbounds i8* %mem, i64 16 + %i.64 = zext i32 %i to i64 + %b = getelementptr inbounds i8* %a.plus1, i64 %i.64 + %i.plus1 = add nuw nsw i32 %i, 1 + %cmp = icmp eq i32 %i.plus1, 10 + br i1 %cmp, label %for.loop.exit, label %for.loop + +for.loop.exit: + ret void +} + +; CHECK-LABEL: test_with_varying_base_pointer_in_loop +; CHECK: NoAlias: i8* %a, i8* %b + +define void @test_with_varying_base_pointer_in_loop(i8* %mem.orig) { + br label %for.loop + +for.loop: + %mem = phi i8* [ %mem.orig, %0 ], [ %mem.plus1, %for.loop ] + %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] + %a = getelementptr inbounds i8* %mem, i64 8 + %a.plus1 = getelementptr inbounds i8* %mem, i64 16 + %i.64 = zext i32 %i to i64 + %b = getelementptr inbounds i8* %a.plus1, i64 %i.64 + %i.plus1 = add nuw nsw i32 %i, 1 + %mem.plus1 = getelementptr inbounds i8* %mem, i64 8 + %cmp = icmp eq i32 %i.plus1, 10 + br i1 %cmp, label %for.loop.exit, label %for.loop + +for.loop.exit: + ret void +} + +; CHECK-LABEL: test_sign_extension +; CHECK: PartialAlias: i64* %b.i64, i8* %a + +define void @test_sign_extension(i32 %p) { + %1 = tail call i8* @malloc(i64 120) + %p.64 = zext i32 %p to i64 + %a = getelementptr inbounds i8* %1, i64 %p.64 + %p.minus1 = add i32 %p, -1 + %p.minus1.64 = zext i32 %p.minus1 to i64 + %b.i8 = getelementptr inbounds i8* %1, i64 %p.minus1.64 + %b.i64 = bitcast i8* %b.i8 to i64* + ret void +} + +; CHECK-LABEL: test_fe_tools +; CHECK: PartialAlias: i32* %a, i32* %b + +define void @test_fe_tools([8 x i32]* %values) { + br label %reorder + +for.loop: + %i = phi i32 [ 0, %reorder ], [ %i.next, %for.loop ] + %idxprom = zext i32 %i to i64 + %b = getelementptr inbounds [8 x i32]* %values, i64 0, i64 %idxprom + %i.next = add nuw nsw i32 %i, 1 + %1 = icmp eq i32 %i.next, 10 + br i1 %1, label %for.loop.exit, label %for.loop + +reorder: + %a = getelementptr inbounds [8 x i32]* %values, i64 0, i64 1 + br label %for.loop + +for.loop.exit: + ret void +} + +@b = global i32 0, align 4 +@d = global i32 0, align 4 + +; CHECK-LABEL: test_spec2006 +; CHECK: PartialAlias: i32** %x, i32** %y + +define void @test_spec2006() { + %h = alloca [1 x [2 x i32*]], align 16 + %d.val = load i32* @d, align 4 + %d.promoted = sext i32 %d.val to i64 + %1 = icmp slt i32 %d.val, 2 + br i1 %1, label %.lr.ph, label %3 + +.lr.ph: ; preds = %0 + br label %2 + +; <label>:2 ; preds = %.lr.ph, %2 + %i = phi i32 [ %d.val, %.lr.ph ], [ %i.plus1, %2 ] + %i.promoted = sext i32 %i to i64 + %x = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 %d.promoted, i64 %i.promoted + %i.plus1 = add nsw i32 %i, 1 + %cmp = icmp slt i32 %i.plus1, 2 + br i1 %cmp, label %2, label %3 + +; <label>:3 ; preds = %._crit_edge, %0 + %y = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 + ret void +} + +; CHECK-LABEL: test_modulo_analysis_easy_case +; CHECK: NoAlias: i32** %x, i32** %y + +define void @test_modulo_analysis_easy_case(i64 %i) { + %h = alloca [1 x [2 x i32*]], align 16 + %x = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 %i, i64 0 + %y = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 + ret void +} + +; CHECK-LABEL: test_modulo_analysis_in_loop +; CHECK: NoAlias: i32** %x, i32** %y + +define void @test_modulo_analysis_in_loop() { + %h = alloca [1 x [2 x i32*]], align 16 + br label %for.loop + +for.loop: + %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] + %i.promoted = sext i32 %i to i64 + %x = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 0 + %y = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 + %i.plus1 = add nsw i32 %i, 1 + %cmp = icmp slt i32 %i.plus1, 2 + br i1 %cmp, label %for.loop, label %for.loop.exit + +for.loop.exit: + ret void +} + +; CHECK-LABEL: test_modulo_analysis_with_global +; CHECK: PartialAlias: i32** %x, i32** %y + +define void @test_modulo_analysis_with_global() { + %h = alloca [1 x [2 x i32*]], align 16 + %b = load i32* @b, align 4 + %b.promoted = sext i32 %b to i64 + br label %for.loop + +for.loop: + %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ] + %i.promoted = sext i32 %i to i64 + %x = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 %b.promoted + %y = getelementptr inbounds [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1 + %i.plus1 = add nsw i32 %i, 1 + %cmp = icmp slt i32 %i.plus1, 2 + br i1 %cmp, label %for.loop, label %for.loop.exit + +for.loop.exit: + ret void +} + +; CHECK-LABEL: test_const_eval +; CHECK: NoAlias: i8* %a, i8* %b +define void @test_const_eval(i8* %ptr, i64 %offset) { + %a = getelementptr inbounds i8* %ptr, i64 %offset + %a.dup = getelementptr inbounds i8* %ptr, i64 %offset + %three = zext i32 3 to i64 + %b = getelementptr inbounds i8* %a.dup, i64 %three + ret void +} + +; CHECK-LABEL: test_const_eval_scaled +; CHECK: MustAlias: i8* %a, i8* %b +define void @test_const_eval_scaled(i8* %ptr) { + %three = zext i32 3 to i64 + %six = mul i64 %three, 2 + %a = getelementptr inbounds i8* %ptr, i64 %six + %b = getelementptr inbounds i8* %ptr, i64 6 + ret void +} + +; Function Attrs: nounwind +declare noalias i8* @malloc(i64) |