111 changes: 83 additions & 28 deletions llvm/test/Analysis/BasicAA/vscale.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ define void @gep_alloca_const_offset_1() {
%alloc = alloca <vscale x 4 x i32>
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep2
ret void
}

Expand All @@ -22,6 +25,9 @@ define void @gep_alloca_const_offset_2() {
%alloc = alloca <vscale x 4 x i32>
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep2
ret void
}

Expand All @@ -33,6 +39,9 @@ define void @gep_alloca_const_offset_3() {
%alloc = alloca <vscale x 4 x i32>
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load i32, i32* %gep2
ret void
}

Expand All @@ -44,6 +53,9 @@ define void @gep_alloca_const_offset_4() {
%alloc = alloca <vscale x 4 x i32>
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 0
load <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load i32, i32* %gep2
ret void
}

Expand All @@ -55,17 +67,23 @@ define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) {
%alloc = alloca <vscale x 4 x i32>
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx1
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx2
load <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep2
ret void
}

; CHECK-LABEL: gep_same_base_const_offset
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2
; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
; TODO: AliasResult for gep1,gep2 can be improved as NoAlias
; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
define void @gep_same_base_const_offset(<vscale x 4 x i32>* %p) {
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %gep1
load i32, i32* %gep2
ret void
}

Expand All @@ -76,6 +94,9 @@ define void @gep_same_base_const_offset(<vscale x 4 x i32>* %p) {
define void @gep_same_base_symbolic_offset(<vscale x 4 x i32>* %p, i64 %idx1, i64 %idx2) {
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx1
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx2
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep2
ret void
}

Expand All @@ -89,102 +110,127 @@ define void @gep_same_base_symbolic_offset(<vscale x 4 x i32>* %p, i64 %idx1, i6
define void @gep_different_base_const_offset(<vscale x 4 x i32>* noalias %p1, <vscale x 4 x i32>* noalias %p2) {
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p1, i64 1
%gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p2, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p2
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %gep2
ret void
}

; getelementptr + bitcast

; CHECK-LABEL: gep_bitcast_1
; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %p2
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep1, i32* %p2
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2
; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
; CHECK-DAG: NoAlias: i32* %gep2, i32* %p2
define void @gep_bitcast_1(<vscale x 4 x i32>* %p) {
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
%p2 = bitcast <vscale x 4 x i32>* %p to i32*
%gep2 = getelementptr i32, i32* %p2, i64 4
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %gep1
load i32, i32* %gep2
load i32, i32* %p2
ret void
}

; CHECK-LABEL: gep_bitcast_2
; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p2, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1
; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, i32* %gep1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, float* %gep2
; CHECK-DAG: MayAlias: float* %gep2, i32* %gep1
; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, float* %gep2
; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, <vscale x 4 x float>* %p2
; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x float>* %p2
; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep1, float* %gep2
; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x float>* %p2
define void @gep_bitcast_2(<vscale x 4 x i32>* %p) {
%gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0
%p2 = bitcast <vscale x 4 x i32>* %p to <vscale x 4 x float>*
%gep2 = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %p2, i64 1, i64 0
load i32, i32* %gep1
load float, float* %gep2
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load <vscale x 4 x float>, <vscale x 4 x float>* %p2
ret void
}

; getelementptr recursion

; CHECK-LABEL: gep_recursion_level_1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %a, i32* %gep
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
define void @gep_recursion_level_1(i32* %a, <vscale x 4 x i32>* %p) {
%gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
%gep_rec_1 = getelementptr i32, i32* %gep, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %a
load i32, i32* %gep
load i32, i32* %gep_rec_1
ret void
}

; CHECK-LABEL: gep_recursion_level_1_bitcast
; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %a
; CHECK-DAG: MustAlias: i32* %a, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %a, i32* %gep
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
define void @gep_recursion_level_1_bitcast(i32* %a) {
%p = bitcast i32* %a to <vscale x 4 x i32>*
%gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
%gep_rec_1 = getelementptr i32, i32* %gep, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %a
load i32, i32* %gep
load i32, i32* %gep_rec_1
ret void
}

; CHECK-LABEL: gep_recursion_level_2
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %a, i32* %gep
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2
; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2
define void @gep_recursion_level_2(i32* %a, <vscale x 4 x i32>* %p) {
%gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2
%gep_rec_1 = getelementptr i32, i32* %gep, i64 1
%gep_rec_2 = getelementptr i32, i32* %gep_rec_1, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %a
load i32, i32* %gep
load i32, i32* %gep_rec_1
load i32, i32* %gep_rec_2
ret void
}

; CHECK-LABEL: gep_recursion_max_lookup_depth_reached
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a
; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %a, i32* %gep
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5
; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_3
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_4
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_5
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_6
; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_3, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_4, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_5, <vscale x 4 x i32>* %p
; CHECK-DAG: MayAlias: i32* %gep_rec_6, <vscale x 4 x i32>* %p
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_3
Expand Down Expand Up @@ -215,5 +261,14 @@ define void @gep_recursion_max_lookup_depth_reached(i32* %a, <vscale x 4 x i32>*
%gep_rec_4 = getelementptr i32, i32* %gep_rec_3, i64 1
%gep_rec_5 = getelementptr i32, i32* %gep_rec_4, i64 1
%gep_rec_6 = getelementptr i32, i32* %gep_rec_5, i64 1
load <vscale x 4 x i32>, <vscale x 4 x i32>* %p
load i32, i32* %a
load i32, i32* %gep
load i32, i32* %gep_rec_1
load i32, i32* %gep_rec_2
load i32, i32* %gep_rec_3
load i32, i32* %gep_rec_4
load i32, i32* %gep_rec_5
load i32, i32* %gep_rec_6
ret void
}
54 changes: 44 additions & 10 deletions llvm/test/Analysis/BasicAA/zext.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ define void @test_with_zext() {
%2 = getelementptr inbounds i8, i8* %1, i64 16
%3 = zext i32 3 to i64
%b = getelementptr inbounds i8, i8* %2, i64 %3
load i8, i8* %a
load i8, i8* %b
ret void
}

Expand All @@ -23,19 +25,23 @@ define void @test_with_lshr(i64 %i) {
%2 = getelementptr inbounds i8, i8* %1, i64 16
%3 = lshr i64 %i, 2
%b = getelementptr inbounds i8, i8* %2, i64 %3
load i8, i8* %a
load i8, i8* %b
ret void
}

; CHECK-LABEL: test_with_lshr_different_sizes
; CHECK: NoAlias: i16* %m2.idx, i8* %m1
; CHECK: NoAlias: i8* %m1, i16* %m2.idx

define void @test_with_lshr_different_sizes(i64 %i) {
%m0 = tail call i8* @malloc(i64 120)
%m1 = getelementptr inbounds i8, i8* %m0, i64 1
load i8, i8* %m1
%m2 = getelementptr inbounds i8, i8* %m0, i64 2
%idx = lshr i64 %i, 2
%m2.i16 = bitcast i8* %m2 to i16*
%m2.idx = getelementptr inbounds i16, i16* %m2.i16, i64 %idx
load i16, i16* %m2.idx
ret void
}

Expand All @@ -48,9 +54,11 @@ define void @test_with_a_loop(i8* %mem) {
for.loop:
%i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ]
%a = getelementptr inbounds i8, i8* %mem, i64 8
load i8, i8* %a
%a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16
%i.64 = zext i32 %i to i64
%b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64
load i8, i8* %b
%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
Expand All @@ -69,9 +77,11 @@ 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, i8* %mem, i64 8
load i8, i8* %a
%a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16
%i.64 = zext i32 %i to i64
%b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64
load i8, i8* %b
%i.plus1 = add nuw nsw i32 %i, 1
%mem.plus1 = getelementptr inbounds i8, i8* %mem, i64 8
%cmp = icmp eq i32 %i.plus1, 10
Expand All @@ -82,16 +92,18 @@ for.loop.exit:
}

; CHECK-LABEL: test_sign_extension
; CHECK: MayAlias: i64* %b.i64, i8* %a
; CHECK: MayAlias: i8* %a, i64* %b.i64

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, i8* %1, i64 %p.64
load i8, i8* %a
%p.minus1 = add i32 %p, -1
%p.minus1.64 = zext i32 %p.minus1 to i64
%b.i8 = getelementptr inbounds i8, i8* %1, i64 %p.minus1.64
%b.i64 = bitcast i8* %b.i8 to i64*
load i64, i64* %b.i64
ret void
}

Expand All @@ -105,12 +117,14 @@ for.loop:
%i = phi i32 [ 0, %reorder ], [ %i.next, %for.loop ]
%idxprom = zext i32 %i to i64
%b = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 %idxprom
load i32, i32* %b
%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
%cmp = icmp eq i32 %i.next, 10
br i1 %cmp, label %for.loop.exit, label %for.loop

reorder:
%a = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 1
load i32, i32* %a
br label %for.loop

for.loop.exit:
Expand All @@ -128,21 +142,23 @@ define void @test_spec2006() {
%d.val = load i32, 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
br i1 %1, label %.lr.ph, label %bb3

.lr.ph: ; preds = %0
br label %2
br label %bb2

; <label>:2 ; preds = %.lr.ph, %2
%i = phi i32 [ %d.val, %.lr.ph ], [ %i.plus1, %2 ]
bb2:
%i = phi i32 [ %d.val, %.lr.ph ], [ %i.plus1, %bb2 ]
%i.promoted = sext i32 %i to i64
%x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %d.promoted, i64 %i.promoted
load i32*, i32** %x
%i.plus1 = add nsw i32 %i, 1
%cmp = icmp slt i32 %i.plus1, 2
br i1 %cmp, label %2, label %3
br i1 %cmp, label %bb2, label %bb3

; <label>:3 ; preds = %._crit_edge, %0
bb3:
%y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
load i32*, i32** %y
ret void
}

Expand All @@ -153,6 +169,8 @@ 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*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i, i64 0
%y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
load i32*, i32** %x
load i32*, i32** %y
ret void
}

Expand All @@ -168,6 +186,8 @@ for.loop:
%i.promoted = sext i32 %i to i64
%x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 0
%y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
load i32*, i32** %x
load i32*, i32** %y
%i.plus1 = add nsw i32 %i, 1
%cmp = icmp slt i32 %i.plus1, 2
br i1 %cmp, label %for.loop, label %for.loop.exit
Expand All @@ -190,6 +210,8 @@ for.loop:
%i.promoted = sext i32 %i to i64
%x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 %b.promoted
%y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
load i32*, i32** %x
load i32*, i32** %y
%i.plus1 = add nsw i32 %i, 1
%cmp = icmp slt i32 %i.plus1, 2
br i1 %cmp, label %for.loop, label %for.loop.exit
Expand All @@ -205,6 +227,8 @@ define void @test_const_eval(i8* %ptr, i64 %offset) {
%a.dup = getelementptr inbounds i8, i8* %ptr, i64 %offset
%three = zext i32 3 to i64
%b = getelementptr inbounds i8, i8* %a.dup, i64 %three
load i8, i8* %a
load i8, i8* %b
ret void
}

Expand All @@ -215,6 +239,8 @@ define void @test_const_eval_scaled(i8* %ptr) {
%six = mul i64 %three, 2
%a = getelementptr inbounds i8, i8* %ptr, i64 %six
%b = getelementptr inbounds i8, i8* %ptr, i64 6
load i8, i8* %a
load i8, i8* %b
ret void
}

Expand Down Expand Up @@ -249,6 +275,8 @@ define void @test_shl_nuw_zext(i8* %p, i32 %x) {
%ext.shl = shl nuw i64 %ext, 1
%p.1 = getelementptr i8, i8* %p, i64 %shl.ext
%p.2 = getelementptr i8, i8* %p, i64 %ext.shl
load i8, i8* %p.1
load i8, i8* %p.2
ret void
}

Expand All @@ -261,6 +289,8 @@ define void @test_shl_nsw_sext(i8* %p, i32 %x) {
%ext.shl = shl nsw i64 %ext, 1
%p.1 = getelementptr i8, i8* %p, i64 %shl.ext
%p.2 = getelementptr i8, i8* %p, i64 %ext.shl
load i8, i8* %p.1
load i8, i8* %p.2
ret void
}

Expand All @@ -272,6 +302,8 @@ define void @test_implicit_sext(i8* %p, i32 %x) {
%ext.add = add i64 %ext, 1
%p.1 = getelementptr i8, i8* %p, i32 %add
%p.2 = getelementptr i8, i8* %p, i64 %ext.add
load i8, i8* %p.1
load i8, i8* %p.2
ret void
}

Expand All @@ -283,6 +315,8 @@ define void @test_partial_decomposition(i8* %p, i32 %x) {
%add.2 = add nsw i32 %add, 1
%p.1 = getelementptr i8, i8* %p, i32 %add.1
%p.2 = getelementptr i8, i8* %p, i32 %add.2
load i8, i8* %p.1
load i8, i8* %p.2
ret void
}

Expand Down
15 changes: 10 additions & 5 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/assign.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@

; CHECK-LABEL: Function: test_assign
; CHECK: NoAlias: i64* %a, i64* %b
; CHECK: NoAlias: i32* %c, i64* %b
; CHECK: NoAlias: i32* %d, i64* %a
; CHECK: NoAlias: i64* %b, i32* %c
; CHECK: NoAlias: i64* %a, i32* %d
; CHECK: NoAlias: i32* %c, i32* %d
; CHECK: MayAlias: i32* %e, i64* %a
; CHECK: MayAlias: i32* %e, i64* %b
; CHECK: MayAlias: i64* %a, i32* %e
; CHECK: MayAlias: i64* %b, i32* %e
; CHECK: MayAlias: i32* %c, i32* %e
; CHECK: MayAlias: i32* %d, i32* %e
define void @test_assign(i1 %cond) {
Expand All @@ -19,5 +19,10 @@ define void @test_assign(i1 %cond) {
%c = bitcast i64* %a to i32*
%d = bitcast i64* %b to i32*
%e = select i1 %cond, i32* %c, i32* %d
load i64, i64* %a
load i64, i64* %b
load i32, i32* %c
load i32, i32* %d
load i32, i32* %e
ret void
}
}
11 changes: 8 additions & 3 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/assign2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s

; CHECK-LABEL: Function: test_assign2
; CHECK: NoAlias: i32* %b, i64* %a
; CHECK: NoAlias: i64* %a, i32* %b
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: NoAlias: i32* %b, i32* %d
; CHECK: MayAlias: i32* %e, i64* %a
; CHECK: MayAlias: i64* %a, i32* %e
; CHECK: MayAlias: i32* %b, i32* %e
; CHECK: MayAlias: i32* %c, i32* %e
; CHECK: MayAlias: i32* %d, i32* %e
Expand All @@ -18,5 +18,10 @@ define void @test_assign2(i1 %cond) {
%c = bitcast i64* %a to i32*
%d = bitcast i64* %a to i32*
%e = select i1 %cond, i32* %c, i32* %b
load i64, i64* %a
load i32, i32* %b
load i32, i32* %c
load i32, i32* %d
load i32, i32* %e
ret void
}
}
68 changes: 40 additions & 28 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/attrs-below.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@
; RUN: opt < %s -aa-pipeline=cfl-anders-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s

; CHECK-LABEL: Function: test_attr_below
; CHECK: MayAlias: i64* %q, i64*** %p
; CHECK: NoAlias: i64* %esc, i64*** %p
; CHECK: NoAlias: i64* %esc, i64* %q

; CHECK: MayAlias: i64* %unknown, i64*** %p
; CHECK: MayAlias: i64* %q, i64* %unknown
; CHECK: MayAlias: i64* %esc, i64* %unknown
; CHECK: MayAlias: i64* %q, i64** %pdrf
; CHECK: MayAlias: i64* %esc, i64** %pdrf
; CHECK: MayAlias: i64* %unknown, i64** %pdrf
; CHECK: MayAlias: i64* %pdrf2, i64* %q
; CHECK: MayAlias: i64* %esc, i64* %pdrf2
; CHECK: MayAlias: i64* %pdrf2, i64* %unknown
; CHECK-DAG: MayAlias: i64*** %p, i64* %q
; CHECK-DAG: NoAlias: i64* %esc, i64*** %p
; CHECK-DAG: NoAlias: i64* %esc, i64* %q

; CHECK-DAG: MayAlias: i64*** %p, i64* %unknown
; CHECK-DAG: MayAlias: i64* %q, i64* %unknown
; CHECK-DAG: MayAlias: i64* %esc, i64* %unknown
; CHECK-DAG: MayAlias: i64** %pdrf, i64* %q
; CHECK-DAG: MayAlias: i64* %esc, i64** %pdrf
; CHECK-DAG: MayAlias: i64** %pdrf, i64* %unknown
; CHECK-DAG: MayAlias: i64* %pdrf2, i64* %q
; CHECK-DAG: MayAlias: i64* %esc, i64* %pdrf2
; CHECK-DAG: MayAlias: i64* %pdrf2, i64* %unknown
define void @test_attr_below(i64*** %p, i64* %q) {
%esc = alloca i64, align 8
%escint = ptrtoint i64* %esc to i64
Expand All @@ -25,25 +25,30 @@ define void @test_attr_below(i64*** %p, i64* %q) {
%pdrf = load i64**, i64*** %p
%pdrf2 = load i64*, i64** %pdrf

load i64, i64* %q
load i64, i64* %esc
load i64, i64* %unknown
load i64, i64* %pdrf2

ret void
}

; CHECK-LABEL: Function: test_attr_assign_below
; CHECK: MayAlias: i64** %sel, i64*** %p
; CHECK: MayAlias: i64* %q, i64** %sel
; CHECK: MayAlias: i64** %a, i64** %sel
; CHECK: MayAlias: i64** %pdrf, i64** %sel

; CHECK: MayAlias: i64** %c, i64*** %p
; CHECK: MayAlias: i64* %q, i64** %c
; CHECK: MayAlias: i64** %a, i64** %c
; CHECK: MayAlias: i64** %c, i64** %pdrf
; CHECK: MayAlias: i64** %c, i64** %sel

; CHECK: MayAlias: i64* %d, i64*** %p
; CHECK: MayAlias: i64* %d, i64* %q
; CHECK: MayAlias: i64* %d, i64** %pdrf
; CHECK: MayAlias: i64* %d, i64** %sel
; CHECK-DAG: MayAlias: i64*** %p, i64** %sel
; CHECK-DAG: MayAlias: i64* %q, i64** %sel
; CHECK-DAG: MayAlias: i64** %a, i64** %sel
; CHECK-DAG: MayAlias: i64** %pdrf, i64** %sel

; CHECK-DAG: MayAlias: i64** %c, i64*** %p
; CHECK-DAG: MayAlias: i64** %c, i64* %q
; CHECK-DAG: MayAlias: i64** %a, i64** %c
; CHECK-DAG: MayAlias: i64** %c, i64** %pdrf
; CHECK-DAG: MayAlias: i64** %c, i64** %sel

; CHECK-DAG: MayAlias: i64* %d, i64*** %p
; CHECK-DAG: MayAlias: i64* %d, i64* %q
; CHECK-DAG: MayAlias: i64* %d, i64** %pdrf
; CHECK-DAG: MayAlias: i64* %d, i64** %sel
define void @test_attr_assign_below(i64*** %p, i64* %q, i1 %cond) {
%a = alloca i64*, align 8
%pdrf = load i64**, i64*** %p
Expand All @@ -55,6 +60,13 @@ define void @test_attr_assign_below(i64*** %p, i64* %q, i1 %cond) {
%c = load i64**, i64*** %b
%d = load i64*, i64** %c

load i64, i64* %q
load i64*, i64** %a
load i64*, i64** %pdrf
load i64*, i64** %sel
load i64*, i64** %c
load i64, i64* %d

ret void
}

49 changes: 34 additions & 15 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/attrs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,62 +11,75 @@ define void @test_local() {
%b = alloca i32, align 4
%aint = ptrtoint i32* %a to i64
%aAlias = inttoptr i64 %aint to i32*
load i32, i32* %a
load i32, i32* %b
load i32, i32* %aAlias
ret void
}

; CHECK-LABEL: Function: test_global_param
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: MayAlias: i32* %a, i32* %xload
; CHECK: MayAlias: i32* %a, i32* %gload
; CHECK: MayAlias: i32* %gload, i32* %xload
; CHECK: MayAlias: i32** %x, i32** @ext_global
; CHECK: NoAlias: i32* %a, i32** @ext_global
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: MayAlias: i32* %a, i32* %xload
; CHECK-DAG: MayAlias: i32* %a, i32* %gload
; CHECK-DAG: MayAlias: i32* %gload, i32* %xload
; CHECK-DAG: MayAlias: i32** %x, i32** @ext_global
; CHECK-DAG: NoAlias: i32* %a, i32** @ext_global
@ext_global = external global i32*
define void @test_global_param(i32** %x) {
%a = alloca i32, align 4
%aint = ptrtoint i32* %a to i64
%xload = load i32*, i32** %x
%gload = load i32*, i32** @ext_global
load i32, i32* %a
load i32, i32* %xload
load i32, i32* %gload
ret void
}

declare void @external_func(i32**)
; CHECK-LABEL: Function: test_external_call
; CHECK: NoAlias: i32* %b, i32* %x
; CHECK: NoAlias: i32* %b, i32** %a
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: MayAlias: i32* %c, i32** %a
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %b
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: MayAlias: i32** %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
define void @test_external_call(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
call void @external_func(i32** %a)
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %b
load i32, i32* %c
ret void
}

declare void @external_func_readonly(i32**) readonly
; CHECK-LABEL: Function: test_external_call_func_readonly
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %c, i32** %a
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %c
define void @test_external_call_func_readonly(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
store i32* %x, i32** %a, align 4
call void @external_func_readonly(i32** %a)
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %c
ret void
}

; CHECK-LABEL: Function: test_external_call_callsite_readonly
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %c, i32** %a
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %c
define void @test_external_call_callsite_readonly(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
store i32* %x, i32** %a, align 4
call void @external_func(i32** %a) readonly
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %c
ret void
}

Expand All @@ -78,6 +91,9 @@ define void @test_external_call_normal_return(i32* %x) {
%a = alloca i32, align 8
%b = alloca i32, align 4
%c = call i32* @external_func_normal_return(i32* %a)
load i32, i32* %x
load i32, i32* %a
load i32, i32* %c
ret void
}

Expand All @@ -89,5 +105,8 @@ define void @test_external_call_noalias_return(i32* %x) {
%a = alloca i32, align 8
%b = alloca i32, align 4
%c = call i32* @external_func_noalias_return(i32* %a)
load i32, i32* %x
load i32, i32* %a
load i32, i32* %c
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ define void @noop_callee(i32* %arg1, i32* %arg2) {
define void @test_noop() {
%a = alloca i32, align 4
%b = alloca i32, align 4
load i32, i32* %a
load i32, i32* %b
call void @noop_callee(i32* %a, i32* %b)

ret void
Expand Down
13 changes: 8 additions & 5 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/cycle.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,27 @@
; CHECK: NoAlias: i64** %b, i64**** %d
; CHECK: NoAlias: i64*** %c, i64**** %d
; CHECK: NoAlias: i64* %a, i64* %e
; CHECK: NoAlias: i64* %e, i64** %b
; CHECK: NoAlias: i64* %e, i64*** %c
; CHECK: NoAlias: i64** %b, i64* %e
; CHECK: NoAlias: i64*** %c, i64* %e
; CHECK: MayAlias: i64* %a, i64* %f
; CHECK: NoAlias: i64* %f, i64** %b
; CHECK: NoAlias: i64* %f, i64*** %c
; CHECK: MayAlias: i64* %f, i64**** %d
; CHECK: NoAlias: i64** %b, i64* %f
; CHECK: NoAlias: i64*** %c, i64* %f
; CHECK: MayAlias: i64**** %d, i64* %f
; CHECK: MayAlias: i64* %e, i64* %f
define void @test_cycle() {
%a = alloca i64, align 8
%b = alloca i64*, align 8
%c = alloca i64**, align 8
%d = alloca i64***, align 8
load i64, i64* %a
store i64* %a, i64** %b
store i64** %b, i64*** %c
store i64*** %c, i64**** %d

%e = bitcast i64**** %d to i64*
load i64, i64* %e
store i64* %e, i64** %b
%f = load i64*, i64** %b
load i64, i64* %f
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,26 @@ define void @escape_arg_deref(i32** %arg) {
ret void
}
; CHECK-LABEL: Function: test_arg_deref_escape
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: NoAlias: i32* %b, i32** %x
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: NoAlias: i32** %p, i32** %x
; CHECK: NoAlias: i32* %a, i32** %p
; CHECK: NoAlias: i32* %b, i32** %p
; CHECK: MayAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: NoAlias: i32* %c, i32** %p
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: NoAlias: i32* %b, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: NoAlias: i32** %p, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32** %p
; CHECK-DAG: NoAlias: i32* %b, i32** %p
; CHECK-DAG: MayAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %c, i32** %p
define void @test_arg_deref_escape(i32** %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4
%p = alloca i32*, align 4

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
call void @escape_arg_deref(i32** %p)
%c = load i32*, i32** %x
load i32, i32* %c

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,26 @@ define void @escape_arg(i32* %arg) {
ret void
}
; CHECK-LABEL: Function: test_arg_escape
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: NoAlias: i32* %b, i32** %x
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: NoAlias: i32* %c, i32** %x
; CHECK: NoAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: MayAlias: i32* %a, i32* %d
; CHECK: MayAlias: i32* %b, i32* %d
; CHECK: NoAlias: i32* %c, i32* %d
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: NoAlias: i32* %b, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: NoAlias: i32* %c, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
; CHECK-DAG: MayAlias: i32* %a, i32* %d
; CHECK-DAG: MayAlias: i32* %b, i32* %d
; CHECK-DAG: NoAlias: i32* %c, i32* %d
define void @test_arg_escape(i32** %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4
%c = alloca i32, align 4
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c
call void @escape_arg(i32* %a)
call void @escape_arg(i32* %b)
%d = load i32*, i32** %x
load i32, i32* %d

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ define void @test_return_arg() {
%b = alloca i32, align 4

%c = call i32* @return_arg_callee(i32* %a, i32* %b)
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,18 @@ define void @test_return_deref_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32** %p, i32*** %pp
%c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
load i32, i32* %c

%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@ define void @test_return_deref_arg() {
%b = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
%c = call i32* @return_deref_arg_callee(i32** %p)
load i32, i32* %c

%lp = load i32*, i32** %p
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ define void @test_return_escape(i32** %x) {
%b = call i32* @return_escaped_callee()
%c = call i32* @return_escaped_callee()
%d = load i32*, i32** %x
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c
load i32, i32* %d

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,20 @@ define i32*** @return_ref_arg_multilevel_callee(i32* %arg1) {
ret i32*** %ptr_cast
}
; CHECK-LABEL: Function: test_return_ref_arg_multilevel
; CHECK: NoAlias: i32* %a, i32*** %b
; CHECK: NoAlias: i32** %p, i32*** %b
; CHECK: NoAlias: i32*** %b, i32*** %pp
; CHECK: NoAlias: i32* %a, i32** %lb
; CHECK: NoAlias: i32** %lb, i32** %p
; CHECK: NoAlias: i32** %lb, i32*** %pp
; CHECK: NoAlias: i32** %lb, i32*** %b
; CHECK: MayAlias: i32* %a, i32* %lb_deref
; CHECK: NoAlias: i32* %lb_deref, i32** %lpp
; CHECK: MayAlias: i32* %lb_deref, i32* %lpp_deref
; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
; CHECK: MayAlias: i32* %lb_deref, i32* %lp
; CHECK: NoAlias: i32* %lp, i32** %lpp
; CHECK: MayAlias: i32* %lp, i32* %lpp_deref
; CHECK-DAG: NoAlias: i32* %a, i32*** %b
; CHECK-DAG: NoAlias: i32*** %b, i32** %p
; CHECK-DAG: NoAlias: i32*** %b, i32*** %pp
; CHECK-DAG: NoAlias: i32* %a, i32** %lb
; CHECK-DAG: NoAlias: i32** %lb, i32** %p
; CHECK-DAG: NoAlias: i32** %lb, i32*** %pp
; CHECK-DAG: NoAlias: i32*** %b, i32** %lb
; CHECK-DAG: MayAlias: i32* %a, i32* %lb_deref
; CHECK-DAG: NoAlias: i32* %lb_deref, i32** %lpp
; CHECK-DAG: MayAlias: i32* %lb_deref, i32* %lpp_deref
; CHECK-DAG: NoAlias: i32** %lpp, i32* %lpp_deref
; CHECK-DAG: MayAlias: i32* %lb_deref, i32* %lp
; CHECK-DAG: NoAlias: i32* %lp, i32** %lpp
; CHECK-DAG: MayAlias: i32* %lp, i32* %lpp_deref

; Temporarily disable modref checks
; Just Mod: Ptr: i32*** %b <-> %b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
Expand All @@ -38,6 +38,7 @@ define void @test_return_ref_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
store i32* %a, i32** %p
store i32** %p, i32*** %pp
%b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
Expand All @@ -47,6 +48,9 @@ define void @test_return_ref_arg_multilevel() {
%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lb_deref
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ define i32** @return_ref_arg_callee(i32* %arg1) {
; CHECK: NoAlias: i32** %b, i32** %p
; CHECK: MayAlias: i32* %a, i32* %lb
; CHECK: NoAlias: i32* %lb, i32** %p
; CHECK: NoAlias: i32* %lb, i32** %b
; CHECK: NoAlias: i32** %b, i32* %lb
; CHECK: NoAlias: i32* %lp, i32** %p
; CHECK: NoAlias: i32* %lp, i32** %b
; CHECK: NoAlias: i32** %b, i32* %lp
; CHECK: MayAlias: i32* %lb, i32* %lp

; Temporarily disable modref checks
Expand All @@ -26,11 +26,14 @@ define void @test_return_ref_arg() {
%a = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %a
store i32* %a, i32** %p
%b = call i32** @return_ref_arg_callee(i32* %a)

%lb = load i32*, i32** %b
%lp = load i32*, i32** %p
load i32, i32* %lb
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ define i32* @return_unknown_callee(i32* %arg1, i32* %arg2) {
ret i32* @g
}
; CHECK-LABEL: Function: test_return_unknown
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
define void @test_return_unknown(i32* %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4

%c = call i32* @return_unknown_callee(i32* %a, i32* %b)
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c
load i32, i32* %x

ret void
}
Expand All @@ -26,12 +30,14 @@ define i32** @return_unknown_callee2() {
ret i32** @g2
}
; CHECK-LABEL: Function: test_return_unknown2
; CHECK: MayAlias: i32* %x, i32** %a
; CHECK: MayAlias: i32* %b, i32* %x
; CHECK: MayAlias: i32* %b, i32** %a
; CHECK-DAG: MayAlias: i32** %a, i32* %x
; CHECK-DAG: MayAlias: i32* %b, i32* %x
; CHECK-DAG: MayAlias: i32** %a, i32* %b
define void @test_return_unknown2(i32* %x) {
%a = call i32** @return_unknown_callee2()
%b = load i32*, i32** %a
load i32, i32* %b
load i32, i32* %x

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ define void @store_arg_multilevel_callee(i32*** %arg1, i32* %arg2) {
; CHECK: MayAlias: i32* %b, i32* %lpp_deref
; CHECK: NoAlias: i32* %lpp_deref, i32** %p
; CHECK: NoAlias: i32* %lpp_deref, i32*** %pp
; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
; CHECK: NoAlias: i32** %lpp, i32* %lpp_deref
; CHECK: MayAlias: i32* %a, i32* %lp
; CHECK: NoAlias: i32* %lp, i32*** %pp
; CHECK: NoAlias: i32* %lp, i32** %lpp
Expand All @@ -32,13 +32,17 @@ define void @test_store_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32** %p, i32*** %pp
call void @store_arg_multilevel_callee(i32*** %pp, i32* %b)

%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ define void @store_arg_unknown_callee(i32** %arg1) {
ret void
}
; CHECK-LABEL: Function: test_store_arg_unknown
; CHECK: NoAlias: i32* %x, i32** %p
; CHECK: NoAlias: i32** %p, i32* %x
; CHECK: NoAlias: i32* %a, i32** %p
; CHECK: NoAlias: i32* %b, i32** %p
; CHECK: MayAlias: i32* %lp, i32* %x
Expand All @@ -22,10 +22,14 @@ define void @test_store_arg_unknown(i32* %x) {
%b = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %x
load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
call void @store_arg_unknown_callee(i32** %p)

%lp = load i32*, i32** %p
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,16 @@ define void @test_store_arg() {
%p = alloca i32*, align 8
%q = alloca i32*, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32* %b, i32** %q
call void @store_arg_callee(i32** %p, i32* %b)

%lp = load i32*, i32** %p
%lq = load i32*, i32** %q
load i32, i32* %lp
load i32, i32* %lq

ret void
}
}
12 changes: 7 additions & 5 deletions llvm/test/Analysis/CFLAliasAnalysis/Andersen/memalias.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,18 @@

; CHECK-LABEL: Function: test_memalias
; CHECK: NoAlias: i64* %a, i64** %b
; CHECK: NoAlias: i32** %c, i64* %a
; CHECK: MayAlias: i32* %d, i64* %a
; CHECK: NoAlias: i32* %d, i64** %b
; CHECK: NoAlias: i32* %d, i32** %c
; CHECK: NoAlias: i64* %a, i32** %c
; CHECK: MayAlias: i64* %a, i32* %d
; CHECK: NoAlias: i64** %b, i32* %d
; CHECK: NoAlias: i32** %c, i32* %d
define void @test_memalias() {
%a = alloca i64, align 8
%b = alloca i64*, align 8
load i64, i64* %a
store i64* %a, i64** %b

%c = bitcast i64** %b to i32**
%d = load i32*, i32** %c
load i32, i32* %d
ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@
; (Everything should alias everything, because args can alias globals, so the
; aliasing sets should of args+alloca+global should be combined)

; RUN: opt < %s -aa-pipeline=cfl-steens-aa -passes=aa-eval -print-may-aliases -disable-output 2>&1 | FileCheck %s
; RUN: opt < %s -aa-pipeline=cfl-steens-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s

; CHECK: Function: test

@g = external global i32

; CHECK: MayAlias: i32* %arg1, i32* %arg2
; CHECK: NoAlias: i32* %A, i32* %arg1
; CHECK: NoAlias: i32* %A, i32* %arg2
; CHECK: MayAlias: i32* %arg1, i32* @g
; CHECK: MayAlias: i32* %arg2, i32* @g
; CHECK: MayAlias: i32* %A, i32* @g
define void @test(i1 %c, i32* %arg1, i32* %arg2) {
; CHECK: 15 Total Alias Queries Performed
; CHECK: 0 no alias responses
%A = alloca i32, align 4
%B = select i1 %c, i32* %arg1, i32* %arg2
%C = select i1 %c, i32* @g, i32* %A
%A = alloca i32
load i32, i32* %arg1
load i32, i32* %arg2
load i32, i32* %A
load i32, i32* @g

ret void
}
4 changes: 4 additions & 0 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/arguments.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ define void @test(i1 %c, i32* %arg1, i32* %arg2) {
; CHECK: 3 no alias responses
%a = alloca i32, align 4
%b = select i1 %c, i32* %arg1, i32* %arg2
load i32, i32* %a
load i32, i32* %b
load i32, i32* %arg1
load i32, i32* %arg2

ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ define void @test_no_crash() #0 {
entry:
call i8* asm "nop", "=r,r"(
i8* getelementptr inbounds ([1 x i8], [1 x i8]* @G, i64 0, i64 0))
load [1 x i8], [1 x i8]* @G
load i8, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @G, i64 0, i64 0)
ret void
}
57 changes: 38 additions & 19 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/attr-escape.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,83 +11,102 @@ define void @test_local() {
%b = alloca i32, align 4
%aint = ptrtoint i32* %a to i64
%aAlias = inttoptr i64 %aint to i32*
load i32, i32* %a
load i32, i32* %b
load i32, i32* %aAlias
ret void
}

; CHECK-LABEL: Function: test_global_param
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: MayAlias: i32* %a, i32* %xload
; CHECK: MayAlias: i32* %a, i32* %gload
; CHECK: MayAlias: i32* %gload, i32* %xload
; CHECK: MayAlias: i32** %x, i32** @ext_global
; CHECK: NoAlias: i32* %a, i32** @ext_global
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: MayAlias: i32* %a, i32* %xload
; CHECK-DAG: MayAlias: i32* %a, i32* %gload
; CHECK-DAG: MayAlias: i32* %gload, i32* %xload
; CHECK-DAG: MayAlias: i32** %x, i32** @ext_global
; CHECK-DAG: NoAlias: i32* %a, i32** @ext_global
@ext_global = external global i32*
define void @test_global_param(i32** %x) {
%a = alloca i32, align 4
%aint = ptrtoint i32* %a to i64
%xload = load i32*, i32** %x
%gload = load i32*, i32** @ext_global
load i32, i32* %a
load i32, i32* %xload
load i32, i32* %gload
ret void
}

declare void @external_func(i32**)
; CHECK-LABEL: Function: test_external_call
; CHECK: NoAlias: i32* %b, i32* %x
; CHECK: NoAlias: i32* %b, i32** %a
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: MayAlias: i32* %c, i32** %a
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %b
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: MayAlias: i32** %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
define void @test_external_call(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
call void @external_func(i32** %a)
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %b
load i32, i32* %c
ret void
}

declare void @external_func_readonly(i32**) readonly
; CHECK-LABEL: Function: test_external_call_func_readonly
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %c, i32** %a
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %c
define void @test_external_call_func_readonly(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
store i32* %x, i32** %a, align 4
call void @external_func_readonly(i32** %a)
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %c
ret void
}

; CHECK-LABEL: Function: test_external_call_callsite_readonly
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %c, i32** %a
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32** %a, i32* %c
define void @test_external_call_callsite_readonly(i32* %x) {
%a = alloca i32*, align 8
%b = alloca i32, align 4
store i32* %x, i32** %a, align 4
call void @external_func(i32** %a) readonly
%c = load i32*, i32** %a
load i32, i32* %x
load i32, i32* %c
ret void
}

declare i32* @external_func_normal_return(i32*)
; CHECK-LABEL: Function: test_external_call_normal_return
; CHECK: MayAlias: i32* %c, i32* %x
; CHECK: MayAlias: i32* %a, i32* %c
; CHECK-DAG: MayAlias: i32* %c, i32* %x
; CHECK-DAG: MayAlias: i32* %a, i32* %c
define void @test_external_call_normal_return(i32* %x) {
%a = alloca i32, align 8
%b = alloca i32, align 4
%c = call i32* @external_func_normal_return(i32* %a)
load i32, i32* %a
load i32, i32* %x
load i32, i32* %c
ret void
}

declare noalias i32* @external_func_noalias_return(i32*)
; CHECK-LABEL: Function: test_external_call_noalias_return
; CHECK: NoAlias: i32* %c, i32* %x
; CHECK: NoAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %c, i32* %x
; CHECK-DAG: NoAlias: i32* %a, i32* %c
define void @test_external_call_noalias_return(i32* %x) {
%a = alloca i32, align 8
%b = alloca i32, align 4
%c = call i32* @external_func_noalias_return(i32* %a)
load i32, i32* %a
load i32, i32* %x
load i32, i32* %c
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ define void @noop_callee(i32* %arg1, i32* %arg2) {
define void @test_noop() {
%a = alloca i32, align 4
%b = alloca i32, align 4
load i32, i32* %a
load i32, i32* %b
call void @noop_callee(i32* %a, i32* %b)

ret void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ entry:
%i = alloca i32, align 4
%AliasA1 = alloca i32**, align 8
%ShouldAliasA = alloca i32*, align 8
%ignore1 = load i32*, i32** %A
store i64 0, i64* %RefCopy, align 8
store i32 0, i32* %i, align 4
br label %for.cond
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ define void @test() {
%D = getelementptr %T, %T* @G, i64 0, i32 0
%F = getelementptr i32, i32* getelementptr (%T, %T* @G, i64 0, i32 0), i64 0
%X = getelementptr [10 x i8], [10 x i8]* getelementptr (%T, %T* @G, i64 0, i32 1), i64 0, i64 5
load i32, i32* %D
load i32, i32* %F
load i8, i8* %X

ret void
}
Expand All @@ -32,6 +35,9 @@ define void @test() {
define void @simplecheck(i32* %arg0) {
%F = getelementptr i32, i32* getelementptr (%T, %T* @G, i64 0, i32 0), i64 0
%H = getelementptr %T, %T* @G2, i64 0, i32 0
load i32, i32* %arg0
load i32, i32* %F
load i32, i32* %H

ret void
}
Expand All @@ -53,5 +59,7 @@ define void @checkNesting(i32* %arg0) {
i32 0),
i64 0,
i32 0
load i32, i32* %arg0
load i32, i32* %A
ret void
}
21 changes: 11 additions & 10 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/const-exprs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,21 @@
@g3 = extern_weak dso_local global i32, align 4

; CHECK-LABEL: Function: foo
; CHECK: NoAlias: i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3), i32** %a
; CHECK: NoAlias: i32* %b, i32** %a
; CHECK: MayAlias: i32* %b, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK: NoAlias: i32* @g2, i32** %a
; CHECK: MayAlias: i32* @g2, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK: MayAlias: i32* %b, i32* @g2
; CHECK: NoAlias: i32* @g3, i32** %a
; CHECK: MayAlias: i32* @g3, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK: MayAlias: i32* %b, i32* @g3
; CHECK: MayAlias: i32* @g2, i32* @g3
; CHECK-DAG: NoAlias: i32** %a, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK-DAG: NoAlias: i32** %a, i32* %b
; CHECK-DAG: MayAlias: i32* %b, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK-DAG: NoAlias: i32** %a, i32* @g2
; CHECK-DAG: MayAlias: i32* @g2, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK-DAG: MayAlias: i32* %b, i32* @g2
; CHECK-DAG: NoAlias: i32** %a, i32* @g3
; CHECK-DAG: MayAlias: i32* @g3, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
; CHECK-DAG: MayAlias: i32* %b, i32* @g3
; CHECK-DAG: MayAlias: i32* @g2, i32* @g3

define void @foo() {
entry:
%a = alloca i32*, align 8
load i32, i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3)
store i32* select (i1 icmp ne (i32* @g, i32* null), i32* @g2, i32* @g3), i32** %a
%b = load i32*, i32** %a
%c = load i32, i32* %b
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,9 @@ define void @foo(i32 %n) {
%b = alloca [2 x i32], align 4
%c = getelementptr inbounds [2 x i32], [2 x i32]* %a, i32 0, i32 %n
%d = getelementptr inbounds [2 x i32], [2 x i32]* %b, i32 0, i32 %n
load [2 x i32], [2 x i32]* %a
load [2 x i32], [2 x i32]* %b
load i32, i32* %c
load i32, i32* %d
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,26 @@ define void @escape_arg_deref(i32** %arg) {
ret void
}
; CHECK-LABEL: Function: test_arg_deref_escape
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: NoAlias: i32* %b, i32** %x
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: NoAlias: i32** %p, i32** %x
; CHECK: NoAlias: i32* %a, i32** %p
; CHECK: NoAlias: i32* %b, i32** %p
; CHECK: MayAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: NoAlias: i32* %c, i32** %p
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: NoAlias: i32* %b, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: NoAlias: i32** %p, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32** %p
; CHECK-DAG: NoAlias: i32* %b, i32** %p
; CHECK-DAG: MayAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %c, i32** %p
define void @test_arg_deref_escape(i32** %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4
%p = alloca i32*, align 4

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
call void @escape_arg_deref(i32** %p)
%c = load i32*, i32** %x
load i32, i32* %c

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,26 @@ define void @escape_arg(i32* %arg) {
ret void
}
; CHECK-LABEL: Function: test_arg_escape
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: NoAlias: i32* %b, i32** %x
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: NoAlias: i32* %c, i32** %x
; CHECK: NoAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: MayAlias: i32* %a, i32* %d
; CHECK: MayAlias: i32* %b, i32* %d
; CHECK: NoAlias: i32* %c, i32* %d
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: NoAlias: i32* %b, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: NoAlias: i32* %c, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
; CHECK-DAG: MayAlias: i32* %a, i32* %d
; CHECK-DAG: MayAlias: i32* %b, i32* %d
; CHECK-DAG: NoAlias: i32* %c, i32* %d
define void @test_arg_escape(i32** %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4
%c = alloca i32, align 4
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c
call void @escape_arg(i32* %a)
call void @escape_arg(i32* %b)
%d = load i32*, i32** %x
load i32, i32* %d

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ define void @test_return_arg() {
%a = alloca i32, align 4
%b = alloca i32, align 4

load i32, i32* %a
load i32, i32* %b
%c = call i32* @return_arg_callee(i32* %a, i32* %b)
load i32, i32* %c

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,18 @@ define void @test_return_deref_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32** %p, i32*** %pp
%c = call i32* @return_deref_arg_multilevel_callee(i32*** %pp)
load i32, i32* %c

%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@ define void @test_return_deref_arg() {
%b = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
%c = call i32* @return_deref_arg_callee(i32** %p)

%lp = load i32*, i32** %p
load i32, i32* %c
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,24 @@ define i32* @return_escaped_callee() {
ret i32* %ptr_cast
}
; CHECK-LABEL: Function: test_return_escape
; CHECK: NoAlias: i32* %a, i32** %x
; CHECK: NoAlias: i32* %b, i32** %x
; CHECK: NoAlias: i32* %a, i32* %b
; CHECK: NoAlias: i32* %c, i32** %x
; CHECK: NoAlias: i32* %a, i32* %c
; CHECK: NoAlias: i32* %b, i32* %c
; CHECK: NoAlias: i32* %a, i32* %d
; CHECK: MayAlias: i32* %b, i32* %d
; CHECK: MayAlias: i32* %c, i32* %d
; CHECK-DAG: NoAlias: i32* %a, i32** %x
; CHECK-DAG: NoAlias: i32* %b, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %b
; CHECK-DAG: NoAlias: i32* %c, i32** %x
; CHECK-DAG: NoAlias: i32* %a, i32* %c
; CHECK-DAG: NoAlias: i32* %b, i32* %c
; CHECK-DAG: NoAlias: i32* %a, i32* %d
; CHECK-DAG: MayAlias: i32* %b, i32* %d
; CHECK-DAG: MayAlias: i32* %c, i32* %d
define void @test_return_escape(i32** %x) {
%a = alloca i32, align 4
%b = call i32* @return_escaped_callee()
%c = call i32* @return_escaped_callee()
load i32, i32* %a
load i32, i32* %b
load i32, i32* %c
%d = load i32*, i32** %x
load i32, i32* %d

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@ define i32*** @return_ref_arg_multilevel_callee(i32* %arg1) {
ret i32*** %ptr_cast
}
; CHECK-LABEL: Function: test_return_ref_arg_multilevel
; CHECK: NoAlias: i32* %a, i32*** %b
; CHECK: NoAlias: i32** %p, i32*** %b
; CHECK: NoAlias: i32* %a, i32** %lb
; CHECK: NoAlias: i32** %lb, i32*** %pp
; CHECK: NoAlias: i32** %lb, i32*** %b
; CHECK: MayAlias: i32* %a, i32* %lb_deref
; CHECK: NoAlias: i32* %lb_deref, i32** %lpp
; CHECK: MayAlias: i32* %lb_deref, i32* %lpp_deref
; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
; CHECK: MayAlias: i32* %lb_deref, i32* %lp
; CHECK: NoAlias: i32* %lp, i32** %lpp
; CHECK: MayAlias: i32* %lp, i32* %lpp_deref
; CHECK-DAG: NoAlias: i32* %a, i32*** %b
; CHECK-DAG: NoAlias: i32*** %b, i32** %p
; CHECK-DAG: NoAlias: i32* %a, i32** %lb
; CHECK-DAG: NoAlias: i32** %lb, i32*** %pp
; CHECK-DAG: NoAlias: i32*** %b, i32** %lb
; CHECK-DAG: MayAlias: i32* %a, i32* %lb_deref
; CHECK-DAG: NoAlias: i32* %lb_deref, i32** %lpp
; CHECK-DAG: MayAlias: i32* %lb_deref, i32* %lpp_deref
; CHECK-DAG: NoAlias: i32** %lpp, i32* %lpp_deref
; CHECK-DAG: MayAlias: i32* %lb_deref, i32* %lp
; CHECK-DAG: NoAlias: i32* %lp, i32** %lpp
; CHECK-DAG: MayAlias: i32* %lp, i32* %lpp_deref

; We could've proven the following facts if the analysis were inclusion-based:
; NoAlias: i32*** %b, i32*** %pp
Expand All @@ -36,6 +36,7 @@ define void @test_return_ref_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
store i32* %a, i32** %p
store i32** %p, i32*** %pp
%b = call i32*** @return_ref_arg_multilevel_callee(i32* %a)
Expand All @@ -45,6 +46,9 @@ define void @test_return_ref_arg_multilevel() {
%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lb_deref
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ define i32** @return_ref_arg_callee(i32* %arg1) {
; CHECK-LABEL: Function: test_return_ref_arg
; CHECK: MayAlias: i32* %a, i32* %lb
; CHECK: NoAlias: i32* %lb, i32** %p
; CHECK: NoAlias: i32* %lb, i32** %b
; CHECK: NoAlias: i32** %b, i32* %lb
; CHECK: NoAlias: i32* %lp, i32** %p
; CHECK: NoAlias: i32* %lp, i32** %b
; CHECK: NoAlias: i32** %b, i32* %lp
; CHECK: MayAlias: i32* %lb, i32* %lp

; We could've proven the following facts if the analysis were inclusion-based:
Expand All @@ -25,11 +25,14 @@ define void @test_return_ref_arg() {
%a = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %a
store i32* %a, i32** %p
%b = call i32** @return_ref_arg_callee(i32* %a)

%lb = load i32*, i32** %b
%lp = load i32*, i32** %p
load i32, i32* %lb
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ define void @test_return_unknown(i32* %x) {
%a = alloca i32, align 4
%b = alloca i32, align 4

load i32, i32* %x
load i32, i32* %a
load i32, i32* %b
%c = call i32* @return_unknown_callee(i32* %a, i32* %b)
load i32, i32* %c

ret void
}
Expand All @@ -26,12 +30,14 @@ define i32** @return_unknown_callee2() {
ret i32** @g2
}
; CHECK-LABEL: Function: test_return_unknown2
; CHECK: MayAlias: i32* %x, i32** %a
; CHECK: MayAlias: i32** %a, i32* %x
; CHECK: MayAlias: i32* %b, i32* %x
; CHECK: MayAlias: i32* %b, i32** %a
; CHECK: MayAlias: i32** %a, i32* %b
define void @test_return_unknown2(i32* %x) {
load i32, i32* %x
%a = call i32** @return_unknown_callee2()
%b = load i32*, i32** %a
load i32, i32* %b

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ define void @store_arg_multilevel_callee(i32*** %arg1, i32* %arg2) {
; CHECK: MayAlias: i32* %b, i32* %lpp_deref
; CHECK: NoAlias: i32* %lpp_deref, i32** %p
; CHECK: NoAlias: i32* %lpp_deref, i32*** %pp
; CHECK: NoAlias: i32* %lpp_deref, i32** %lpp
; CHECK: NoAlias: i32** %lpp, i32* %lpp_deref
; CHECK: MayAlias: i32* %a, i32* %lp
; CHECK: NoAlias: i32* %lp, i32*** %pp
; CHECK: NoAlias: i32* %lp, i32** %lpp
Expand All @@ -34,13 +34,17 @@ define void @test_store_arg_multilevel() {
%p = alloca i32*, align 8
%pp = alloca i32**, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32** %p, i32*** %pp
call void @store_arg_multilevel_callee(i32*** %pp, i32* %b)

%lpp = load i32**, i32*** %pp
%lpp_deref = load i32*, i32** %lpp
%lp = load i32*, i32** %p
load i32, i32* %lpp_deref
load i32, i32* %lp

ret void
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ define void @store_arg_unknown_callee(i32** %arg1) {
ret void
}
; CHECK-LABEL: Function: test_store_arg_unknown
; CHECK: NoAlias: i32* %x, i32** %p
; CHECK: NoAlias: i32** %p, i32* %x
; CHECK: NoAlias: i32* %a, i32** %p
; CHECK: NoAlias: i32* %b, i32** %p
; CHECK: MayAlias: i32* %lp, i32* %x
Expand All @@ -22,10 +22,14 @@ define void @test_store_arg_unknown(i32* %x) {
%b = alloca i32, align 4
%p = alloca i32*, align 8

load i32, i32* %x
load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
call void @store_arg_unknown_callee(i32** %p)

%lp = load i32*, i32** %p
load i32, i32* %lp

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,16 @@ define void @test_store_arg() {
%p = alloca i32*, align 8
%q = alloca i32*, align 8

load i32, i32* %a
load i32, i32* %b
store i32* %a, i32** %p
store i32* %b, i32** %q
call void @store_arg_callee(i32** %p, i32* %b)

%lp = load i32*, i32** %p
%lq = load i32*, i32** %q
load i32, i32* %lp
load i32, i32* %lq

ret void
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@ declare void @free(i8* nocapture)
; CHECK: NoAlias: i8* %p, i8* %q
define void @test_malloc(i8* %p) {
%q = call i8* @malloc(i64 4)
load i8, i8* %p
load i8, i8* %q
ret void
}

; CHECK: Function: test_calloc
; CHECK: NoAlias: i8* %p, i8* %q
define void @test_calloc(i8* %p) {
%q = call i8* @calloc(i64 2, i64 4)
load i8, i8* %p
load i8, i8* %q
ret void
}

Expand All @@ -25,5 +29,7 @@ define void @test_calloc(i8* %p) {
define void @test_free(i8* %p) {
%q = alloca i8, align 4
call void @free(i8* %q)
load i8, i8* %p
load i8, i8* %q
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ define void @test(i1 %C) {
store %T* %MS, %T** %M

%AP = load %T*, %T** %M ; PartialAlias with %A, %B
load %T, %T* %A
load %T, %T* %B
load %T, %T* %MS
load %T, %T* %AP

ret void
}
4 changes: 4 additions & 0 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/multilevel.ll
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ define void @test() {

%AP = load %T*, %T** %M ; PartialAlias with %A
%BP = load %T*, %T** %N ; PartialAlias with %B
load %T, %T* %A
load %T, %T* %B
load %T, %T* %AP
load %T, %T* %BP

ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ entry:
ret i8 %loaded
}

; Incoming pointer arguments should not be PartialAlias because we do not know their initial state
; Incoming pointer arguments should not be MayAlias because we do not know their initial state
; even if they are nocapture
; CHECK: MayAlias: double* %A, double* %Index
define void @testr2(double* nocapture readonly %A, double* nocapture readonly %Index) {
Expand All @@ -51,5 +51,7 @@ define void @testr2(double* nocapture readonly %A, double* nocapture readonly %I
%2 = load double, double* %arrayidx25
%3 = fneg double %1
%mul26 = fmul double %3, %2
load double, double* %A
load double, double* %Index
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@
define void @test(i8* %Arg) {
%Noalias = alloca i8
%Escapes = alloca i8
load i8, i8* %Arg
load i8, i8* %Escapes
call void @set_thepointer(i8* %Escapes)
%Retrieved = call i8* @get_thepointer()
load i8, i8* %Retrieved
ret void
}

Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/pr27213.ll
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ entry:
define void @bar(i32* %A, i32* %B) {
entry:
store i32 0, i32* %A, align 4
load i32, i32* %B
%arrayidx = getelementptr inbounds i32, i32* %B, i64 1
store i32 0, i32* %arrayidx, align 4
ret void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,19 @@ define void @test(i1 %cond,
i32* %arg26, i32* %arg27, i32* %arg28, i32* %arg29, i32* %arg30,
i32* %arg31, i32* %arg32, i32* %arg33, i32* %arg34, i32* %arg35) {

; CHECK: 946 Total Alias Queries Performed
; CHECK: 43 no alias responses (4.5%)
; CHECK: 45 Total Alias Queries Performed
; CHECK: 9 no alias responses (20.0%)
%a = alloca i32, align 4
%b = select i1 %cond, i32* %arg35, i32* %arg34
%c = select i1 %cond, i32* %arg34, i32* %arg33
%d = select i1 %cond, i32* %arg33, i32* %arg32
%e = select i1 %cond, i32* %arg32, i32* %arg31
%f = select i1 %cond, i32* %arg31, i32* %arg30
%g = select i1 %cond, i32* %arg30, i32* %arg29
%h = select i1 %cond, i32* %arg29, i32* %arg28
%i = select i1 %cond, i32* %arg28, i32* %arg27
load i32, i32* %a
load i32, i32* %arg27
load i32, i32* %arg28
load i32, i32* %arg29
load i32, i32* %arg30
load i32, i32* %arg31
load i32, i32* %arg32
load i32, i32* %arg33
load i32, i32* %arg34
load i32, i32* %arg35

ret void
}
13 changes: 9 additions & 4 deletions llvm/test/Analysis/CFLAliasAnalysis/Steensgaard/va.ll
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
; RUN: opt < %s -aa-pipeline=cfl-steens-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s

; CHECK-LABEL: Function: test1
; CHECK: MayAlias: i32* %X, i32* %tmp
; CHECK: MayAlias: i32* %tmp, i8** %ap
; CHECK: NoAlias: i8** %ap, i8** %aq
; CHECK: MayAlias: i32* %tmp, i8** %aq
; CHECK-DAG: MayAlias: i32* %X, i32* %tmp
; CHECK-DAG: MayAlias: i8** %ap, i32* %tmp
; CHECK-DAG: NoAlias: i8** %ap, i8** %aq
; CHECK-DAG: MayAlias: i8** %aq, i32* %tmp

define i32* @test1(i32* %X, ...) {
; Initialize variable argument processing
Expand All @@ -23,6 +23,11 @@ define i32* @test1(i32* %X, ...) {

; Stop processing of arguments.
call void @llvm.va_end(i8* %ap2)

load i32, i32* %X
load i8*, i8** %ap
load i8*, i8** %aq
load i32, i32* %tmp
ret i32* %tmp
}

Expand Down
5 changes: 3 additions & 2 deletions llvm/test/Analysis/GlobalsModRef/addrspacecast.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

; CHECK-LABEL: test1
; CHECK-DAG: NoAlias: i32* %gp, i32* %p
; CHECK-DAG: NoAlias: i32 addrspace(3)* @g0, i32* %p
; CHECK-DAG: MustAlias: i32 addrspace(3)* @g0, i32* %gp
; CHECK-DAG: NoAlias: i32* %p, i32 addrspace(3)* @g0
; CHECK-DAG: MustAlias: i32* %gp, i32 addrspace(3)* @g0
define i32 @test1(i32* %p) {
load i32, i32 addrspace(3)* @g0
%gp = addrspacecast i32 addrspace(3)* @g0 to i32*
store i32 0, i32* %gp
store i32 1, i32* %p
Expand Down
61 changes: 35 additions & 26 deletions llvm/test/Analysis/ScalarEvolution/scev-aa.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64"

; p[i] and p[i+1] don't alias.

; CHECK: Function: loop: 3 pointers, 0 call sites
; CHECK-LABEL: Function: loop
; CHECK: NoAlias: double* %pi, double* %pi.next

define void @loop(double* nocapture %p, i64 %n) nounwind {
Expand All @@ -35,7 +35,7 @@ return:

; Slightly more involved: p[j][i], p[j][i+1], and p[j+1][i] don't alias.

; CHECK: Function: nestedloop: 4 pointers, 0 call sites
; CHECK-LABEL: Function: nestedloop
; CHECK: NoAlias: double* %pi.j, double* %pi.next.j
; CHECK: NoAlias: double* %pi.j, double* %pi.j.next
; CHECK: NoAlias: double* %pi.j.next, double* %pi.next.j
Expand Down Expand Up @@ -93,7 +93,7 @@ return:
; however the analysis currently doesn't do that.
; TODO: Make the analysis smarter and turn that MayAlias into a NoAlias.

; CHECK: Function: nestedloop_more: 4 pointers, 0 call sites
; CHECK-LABEL: Function: nestedloop_more
; CHECK: NoAlias: double* %pi.j, double* %pi.next.j
; CHECK: MayAlias: double* %pi.j, double* %pi.j.next

Expand Down Expand Up @@ -149,14 +149,14 @@ return:
%struct.A = type { %struct.B, i32, i32 }
%struct.B = type { double }

; CHECK: Function: foo: 7 pointers, 0 call sites
; CHECK: NoAlias: %struct.B* %B, i32* %Z
; CHECK: NoAlias: %struct.B* %B, %struct.B* %C
; CHECK: MustAlias: %struct.B* %C, i32* %Z
; CHECK: NoAlias: %struct.B* %B, i32* %X
; CHECK: MustAlias: i32* %X, i32* %Z
; CHECK: MustAlias: %struct.B* %C, i32* %Y
; CHECK: MustAlias: i32* %X, i32* %Y
; CHECK-LABEL: Function: foo
; CHECK-DAG: NoAlias: %struct.B* %B, i32* %Z
; CHECK-DAG: NoAlias: %struct.B* %B, %struct.B* %C
; CHECK-DAG: MustAlias: %struct.B* %C, i32* %Z
; CHECK-DAG: NoAlias: %struct.B* %B, i32* %X
; CHECK-DAG: MustAlias: i32* %X, i32* %Z
; CHECK-DAG: MustAlias: %struct.B* %C, i32* %Y
; CHECK-DAG: MustAlias: i32* %X, i32* %Y

define void @foo() {
entry:
Expand All @@ -167,17 +167,22 @@ entry:
%C = getelementptr %struct.B, %struct.B* %B, i32 1
%X = bitcast %struct.B* %C to i32*
%Y = getelementptr %struct.A, %struct.A* %A, i32 0, i32 1
load %struct.B, %struct.B* %B
load %struct.B, %struct.B* %C
load i32, i32* %X
load i32, i32* %Y
load i32, i32* %Z
ret void
}

; CHECK: Function: bar: 7 pointers, 0 call sites
; CHECK: NoAlias: %struct.B* %N, i32* %P
; CHECK: NoAlias: %struct.B* %N, %struct.B* %R
; CHECK: MustAlias: %struct.B* %R, i32* %P
; CHECK: NoAlias: %struct.B* %N, i32* %W
; CHECK: MustAlias: i32* %P, i32* %W
; CHECK: MustAlias: %struct.B* %R, i32* %V
; CHECK: MustAlias: i32* %V, i32* %W
; CHECK-LABEL: Function: bar
; CHECK-DAG: NoAlias: %struct.B* %N, i32* %P
; CHECK-DAG: NoAlias: %struct.B* %N, %struct.B* %R
; CHECK-DAG: MustAlias: i32* %P, %struct.B* %R
; CHECK-DAG: NoAlias: %struct.B* %N, i32* %W
; CHECK-DAG: MustAlias: i32* %P, i32* %W
; CHECK-DAG: MustAlias: %struct.B* %R, i32* %V
; CHECK-DAG: MustAlias: i32* %V, i32* %W

define void @bar() {
%M = alloca %struct.A
Expand All @@ -187,6 +192,11 @@ define void @bar() {
%R = getelementptr %struct.B, %struct.B* %N, i32 1
%W = bitcast %struct.B* %R to i32*
%V = getelementptr %struct.A, %struct.A* %M, i32 0, i32 1
load %struct.B, %struct.B* %N
load %struct.B, %struct.B* %R
load i32, i32* %P
load i32, i32* %V
load i32, i32* %W
ret void
}

Expand All @@ -210,7 +220,7 @@ for.end: ; preds = %for.body, %entry
ret void
}

; CHECK: Function: test_no_dom: 3 pointers, 0 call sites
; CHECK-LABEL: Function: test_no_dom: 3 pointers, 0 call sites
; CHECK: MayAlias: double* %addr1, double* %data
; CHECK: NoAlias: double* %addr2, double* %data
; CHECK: MayAlias: double* %addr1, double* %addr2
Expand All @@ -221,6 +231,7 @@ for.end: ; preds = %for.body, %entry
; dominance order.
define void @test_no_dom(double* %data) {
entry:
load double, double* %data
br label %for.body

for.body:
Expand Down Expand Up @@ -253,7 +264,7 @@ for.end:

declare double* @get_addr(i32 %i)

; CHECK: Function: test_no_dom2: 3 pointers, 2 call sites
; CHECK-LABEL: Function: test_no_dom2: 3 pointers, 2 call sites
; CHECK: MayAlias: double* %addr1, double* %data
; CHECK: MayAlias: double* %addr2, double* %data
; CHECK: MayAlias: double* %addr1, double* %addr2
Expand All @@ -263,6 +274,7 @@ declare double* @get_addr(i32 %i)
; to test_no_dom, but involves SCEVUnknown as opposed to SCEVAddRecExpr.
define void @test_no_dom2(double* %data) {
entry:
load double, double* %data
br label %for.body

for.body:
Expand Down Expand Up @@ -294,7 +306,7 @@ for.end:
}


; CHECK: Function: test_dom: 3 pointers, 0 call sites
; CHECK-LABEL: Function: test_dom: 3 pointers, 0 call sites
; CHECK: MayAlias: double* %addr1, double* %data
; CHECK: NoAlias: double* %addr2, double* %data
; CHECK: NoAlias: double* %addr1, double* %addr2
Expand All @@ -304,6 +316,7 @@ for.end:
; addrecs and cancel out the %data base pointer.
define void @test_dom(double* %data) {
entry:
load double, double* %data
br label %for.body

for.body:
Expand Down Expand Up @@ -333,7 +346,3 @@ for.latch:
for.end:
ret void
}

; CHECK: 17 no alias responses
; CHECK: 32 may alias responses
; CHECK: 18 must alias responses
114 changes: 89 additions & 25 deletions llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll
Original file line number Diff line number Diff line change
@@ -1,185 +1,249 @@
; RUN: opt -mtriple=amdgcn-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s
; RUN: opt -mtriple=r600-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s

; CHECK: NoAlias: i8 addrspace(1)* %p1, i8 addrspace(5)* %p
; CHECK-LABEL: Function: test
; CHECK: NoAlias: i8 addrspace(5)* %p, i8 addrspace(1)* %p1

define void @test(i8 addrspace(5)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(5)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p1, i8 addrspace(4)* %p
; CHECK-LABEL: Function: test_constant_vs_global
; CHECK: MayAlias: i8 addrspace(4)* %p, i8 addrspace(1)* %p1

define void @test_constant_vs_global(i8 addrspace(4)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(4)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p, i8 addrspace(4)* %p1

define void @test_global_vs_constant(i8 addrspace(1)* %p, i8 addrspace(4)* %p1) {
load i8, i8 addrspace(1)* %p
load i8, i8 addrspace(4)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p1, i8 addrspace(6)* %p
; CHECK: MayAlias: i8 addrspace(6)* %p, i8 addrspace(1)* %p1

define void @test_constant_32bit_vs_global(i8 addrspace(6)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(6)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(4)* %p1, i8 addrspace(6)* %p
; CHECK: MayAlias: i8 addrspace(6)* %p, i8 addrspace(4)* %p1

define void @test_constant_32bit_vs_constant(i8 addrspace(6)* %p, i8 addrspace(4)* %p1) {
load i8, i8 addrspace(6)* %p
load i8, i8 addrspace(4)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(999)* %p0, i8* %p
; CHECK: MayAlias: i8* %p, i8 addrspace(999)* %p0
define void @test_0_999(i8 addrspace(0)* %p, i8 addrspace(999)* %p0) {
load i8, i8 addrspace(0)* %p
load i8, i8 addrspace(999)* %p0
ret void
}

; CHECK: MayAlias: i8 addrspace(999)* %p, i8* %p1
define void @test_999_0(i8 addrspace(999)* %p, i8 addrspace(0)* %p1) {
load i8, i8 addrspace(999)* %p
load i8, i8 addrspace(0)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p, i8 addrspace(999)* %p1
define void @test_1_999(i8 addrspace(1)* %p, i8 addrspace(999)* %p1) {
load i8, i8 addrspace(1)* %p
load i8, i8 addrspace(999)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p1, i8 addrspace(999)* %p
; CHECK: MayAlias: i8 addrspace(999)* %p, i8 addrspace(1)* %p1
define void @test_999_1(i8 addrspace(999)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(999)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p, i8* %p1
define void @test_region_vs_flat(i8 addrspace(2)* %p, i8 addrspace(0)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(0)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(1)* %p1, i8 addrspace(2)* %p
; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(1)* %p1
define void @test_region_vs_global(i8 addrspace(2)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(2)* %p, i8 addrspace(2)* %p1
define void @test_region(i8 addrspace(2)* %p, i8 addrspace(2)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(2)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(3)* %p1
define void @test_region_vs_group(i8 addrspace(2)* %p, i8 addrspace(3)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(3)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(4)* %p1
define void @test_region_vs_constant(i8 addrspace(2)* %p, i8 addrspace(4)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(4)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(5)* %p1
define void @test_region_vs_private(i8 addrspace(2)* %p, i8 addrspace(5)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(5)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p, i8 addrspace(6)* %p1
define void @test_region_vs_const32(i8 addrspace(2)* %p, i8 addrspace(6)* %p1) {
load i8, i8 addrspace(2)* %p
load i8, i8 addrspace(6)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(7)* %p, i8* %p1
define void @test_7_0(i8 addrspace(7)* %p, i8 addrspace(0)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(0)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(1)* %p1, i8 addrspace(7)* %p
; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(1)* %p1
define void @test_7_1(i8 addrspace(7)* %p, i8 addrspace(1)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(1)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(2)* %p1, i8 addrspace(7)* %p
; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(2)* %p1
define void @test_7_2(i8 addrspace(7)* %p, i8 addrspace(2)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(2)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(3)* %p1, i8 addrspace(7)* %p
; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(3)* %p1
define void @test_7_3(i8 addrspace(7)* %p, i8 addrspace(3)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(3)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(4)* %p1, i8 addrspace(7)* %p
; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(4)* %p1
define void @test_7_4(i8 addrspace(7)* %p, i8 addrspace(4)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(4)* %p1
ret void
}

; CHECK: NoAlias: i8 addrspace(5)* %p1, i8 addrspace(7)* %p
; CHECK: NoAlias: i8 addrspace(7)* %p, i8 addrspace(5)* %p1
define void @test_7_5(i8 addrspace(7)* %p, i8 addrspace(5)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(5)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(6)* %p1, i8 addrspace(7)* %p
; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(6)* %p1
define void @test_7_6(i8 addrspace(7)* %p, i8 addrspace(6)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(6)* %p1
ret void
}

; CHECK: MayAlias: i8 addrspace(7)* %p, i8 addrspace(7)* %p1
define void @test_7_7(i8 addrspace(7)* %p, i8 addrspace(7)* %p1) {
load i8, i8 addrspace(7)* %p
load i8, i8 addrspace(7)* %p1
ret void
}

@cst = internal addrspace(4) global i8* undef, align 4

; CHECK-LABEL: Function: test_8_0
; CHECK: NoAlias: i8 addrspace(3)* %p, i8* %p1
; CHECK: NoAlias: i8 addrspace(3)* %p, i8* addrspace(4)* @cst
; CHECK: MayAlias: i8* %p1, i8* addrspace(4)* @cst
; CHECK-DAG: NoAlias: i8 addrspace(3)* %p, i8* %p1
; CHECK-DAG: NoAlias: i8 addrspace(3)* %p, i8* addrspace(4)* @cst
; CHECK-DAG: MayAlias: i8* %p1, i8* addrspace(4)* @cst
define void @test_8_0(i8 addrspace(3)* %p) {
%p1 = load i8*, i8* addrspace(4)* @cst
load i8, i8 addrspace(3)* %p
load i8, i8* %p1
ret void
}

; CHECK-LABEL: Function: test_8_1
; CHECK: NoAlias: i8 addrspace(5)* %p, i8* %p1
; CHECK: NoAlias: i8 addrspace(5)* %p, i8* addrspace(4)* @cst
; CHECK: MayAlias: i8* %p1, i8* addrspace(4)* @cst
; CHECK-DAG: NoAlias: i8 addrspace(5)* %p, i8* %p1
; CHECK-DAG: NoAlias: i8 addrspace(5)* %p, i8* addrspace(4)* @cst
; CHECK-DAG: MayAlias: i8* %p1, i8* addrspace(4)* @cst
define void @test_8_1(i8 addrspace(5)* %p) {
%p1 = load i8*, i8* addrspace(4)* @cst
load i8, i8 addrspace(5)* %p
load i8, i8* %p1
ret void
}

; CHECK-LABEL: Function: test_8_2
; CHECK: NoAlias: i8 addrspace(5)* %p1, i8* %p
; CHECK: NoAlias: i8* %p, i8 addrspace(5)* %p1
define amdgpu_kernel void @test_8_2(i8* %p) {
%p1 = alloca i8, align 1, addrspace(5)
load i8, i8* %p
load i8, i8 addrspace(5)* %p1
ret void
}

; CHECK-LABEL: Function: test_8_3
; CHECK: MayAlias: i8 addrspace(5)* %p1, i8* %p
; CHECK: MayAlias: i8* %p, i8 addrspace(5)* %p1
; TODO: So far, %p1 may still alias to %p. As it's not captured at all, it
; should be NoAlias.
define void @test_8_3(i8* %p) {
%p1 = alloca i8, align 1, addrspace(5)
load i8, i8* %p
load i8, i8 addrspace(5)* %p1
ret void
}

@shm = internal addrspace(3) global i8 undef, align 4

; CHECK-LABEL: Function: test_8_4
; CHECK: NoAlias: i8 addrspace(3)* %p1, i8* %p
; CHECK: NoAlias: i8 addrspace(3)* @shm, i8* %p
; CHECK: NoAlias: i8* %p, i8 addrspace(3)* %p1
; CHECK: NoAlias: i8* %p, i8 addrspace(3)* @shm
; CHECK: MayAlias: i8 addrspace(3)* %p1, i8 addrspace(3)* @shm
define amdgpu_kernel void @test_8_4(i8* %p) {
%p1 = getelementptr i8, i8 addrspace(3)* @shm, i32 0
load i8, i8* %p
load i8, i8 addrspace(3)* %p1
load i8, i8 addrspace(3)* @shm
ret void
}

; CHECK-LABEL: Function: test_8_5
; CHECK: MayAlias: i8 addrspace(3)* %p1, i8* %p
; CHECK: MayAlias: i8 addrspace(3)* @shm, i8* %p
; CHECK: MayAlias: i8* %p, i8 addrspace(3)* %p1
; CHECK: MayAlias: i8* %p, i8 addrspace(3)* @shm
; CHECK: MayAlias: i8 addrspace(3)* %p1, i8 addrspace(3)* @shm
; TODO: So far, %p1 may still alias to %p. As it's not captured at all, it
; should be NoAlias.
define void @test_8_5(i8* %p) {
%p1 = getelementptr i8, i8 addrspace(3)* @shm, i32 0
load i8, i8* %p
load i8, i8 addrspace(3)* %p1
load i8, i8 addrspace(3)* @shm
ret void
}
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/AMDGPU/r600.amdgpu-alias-analysis.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@

; CHECK: MayAlias: i8 addrspace(5)* %p, i8 addrspace(999)* %p1
define amdgpu_kernel void @test(i8 addrspace(5)* %p, i8 addrspace(999)* %p1) {
load volatile i8, i8 addrspace(5)* %p
load volatile i8, i8 addrspace(999)* %p1
ret void
}