[BasicAA] Add test for select with loop carried dependency (NFC)
authorNikita Popov <npopov@redhat.com>
Fri, 14 Oct 2022 08:31:44 +0000 (10:31 +0200)
committerNikita Popov <npopov@redhat.com>
Fri, 14 Oct 2022 08:32:33 +0000 (10:32 +0200)
llvm/test/Analysis/BasicAA/phi-and-select.ll

index ae28ecb..e7614bb 100644 (file)
@@ -2,17 +2,9 @@
 
 ; BasicAA should detect NoAliases in PHIs and Selects.
 
-; CHECK: Function: foo
-; CHECK:  NoAlias: double* %a, double* %b
-; CHECK: Function: bar
-; CHECK:  NoAlias: double* %a, double* %b
-; CHECK: Function: qux
-; CHECK:  NoAlias: double* %a, double* %b
-; CHECK: Function: fin
-; CHECK:  NoAlias: double* %a, double* %b
-; CHECK: ===== Alias Analysis Evaluator Report =====
-
 ; Two PHIs in the same block.
+; CHECK-LABEL: Function: foo
+; CHECK: NoAlias: double* %a, double* %b
 define void @foo(i1 %m, double* noalias %x, double* noalias %y) {
 entry:
   br i1 %m, label %true, label %false
@@ -32,6 +24,8 @@ exit:
 }
 
 ; Two selects with the same condition.
+; CHECK-LABEL: Function: bar
+; CHECK: NoAlias: double* %a, double* %b
 define void @bar(i1 %m, double* noalias %x, double* noalias %y) {
 entry:
   %a = select i1 %m, double* %x, double* %y
@@ -42,6 +36,8 @@ entry:
 }
 
 ; Two PHIs with disjoint sets of inputs.
+; CHECK-LABEL: Function: qux
+; CHECK: NoAlias: double* %a, double* %b
 define void @qux(i1 %m, double* noalias %x, double* noalias %y,
                  i1 %n, double* noalias %v, double* noalias %w) {
 entry:
@@ -71,6 +67,8 @@ nexit:
 }
 
 ; Two selects with disjoint sets of arms.
+; CHECK-LABEL: Function: fin
+; CHECK: NoAlias: double* %a, double* %b
 define void @fin(i1 %m, double* noalias %x, double* noalias %y,
                  i1 %n, double* noalias %v, double* noalias %w) {
 entry:
@@ -80,3 +78,29 @@ entry:
   store volatile double 1.000000e+00, double* %b
   ret void
 }
+
+; On the first iteration, sel1 = a1, sel2 = a2, phi = a3
+; On the second iteration, sel1 = a2, sel1 = a1, phi = a2
+; As such, sel1 and phi may alias.
+; FIXME: Miscompile.
+; CHECK-LABEL: Function: select_backedge
+; CHECK: NoAlias:      i32* %sel1, i32* %sel2
+; CHECK: NoAlias:      i32* %phi, i32* %sel1
+; CHECK: MayAlias:     i32* %phi, i32* %sel2
+define void @select_backedge() {
+entry:
+  %a1 = alloca i32
+  %a2 = alloca i32
+  %a3 = alloca i32
+  br label %loop
+
+loop:
+  %phi = phi i32* [ %a3, %entry ], [ %sel2, %loop ]
+  %c = phi i1 [ true, %entry ], [ false, %loop ]
+  %sel1 = select i1 %c, i32* %a1, i32* %a2
+  %sel2 = select i1 %c, i32* %a2, i32* %a1
+  load i32, i32* %sel1
+  load i32, i32* %sel2
+  load i32, i32* %phi
+  br label %loop
+}