From 7c5c77878b83807692b22bd217b78082ff3358b6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 14 Oct 2022 10:31:44 +0200 Subject: [PATCH] [BasicAA] Add test for select with loop carried dependency (NFC) --- llvm/test/Analysis/BasicAA/phi-and-select.ll | 44 +++++++++++++++++++++------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/llvm/test/Analysis/BasicAA/phi-and-select.ll b/llvm/test/Analysis/BasicAA/phi-and-select.ll index ae28ecb..e7614bbd 100644 --- a/llvm/test/Analysis/BasicAA/phi-and-select.ll +++ b/llvm/test/Analysis/BasicAA/phi-and-select.ll @@ -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 +} -- 2.7.4