From 237b96203141aa12fa891c1b1506173d851aa07f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 14 Oct 2022 10:35:36 +0200 Subject: [PATCH] [BasicAA] Account for cycles when checking for same select condition If we have translated across a cycle backedge, the same SSA value for the condition might be referring to two different loop iterations. Use the isValueEqualInPotentialCycles() helper to avoid assuming equality in that case. --- llvm/lib/Analysis/BasicAliasAnalysis.cpp | 3 ++- llvm/test/Analysis/BasicAA/phi-and-select.ll | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 16d5f39c31cd..9ec34fa51146 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1303,7 +1303,8 @@ BasicAAResult::aliasSelect(const SelectInst *SI, LocationSize SISize, // If the values are Selects with the same condition, we can do a more precise // check: just check for aliases between the values on corresponding arms. if (const SelectInst *SI2 = dyn_cast(V2)) - if (SI->getCondition() == SI2->getCondition()) { + if (isValueEqualInPotentialCycles(SI->getCondition(), + SI2->getCondition())) { AliasResult Alias = AAQI.AAR.alias(MemoryLocation(SI->getTrueValue(), SISize), MemoryLocation(SI2->getTrueValue(), V2Size), AAQI); diff --git a/llvm/test/Analysis/BasicAA/phi-and-select.ll b/llvm/test/Analysis/BasicAA/phi-and-select.ll index e7614bbd1058..8b5352b25ac7 100644 --- a/llvm/test/Analysis/BasicAA/phi-and-select.ll +++ b/llvm/test/Analysis/BasicAA/phi-and-select.ll @@ -82,10 +82,9 @@ entry: ; 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* %sel1 ; CHECK: MayAlias: i32* %phi, i32* %sel2 define void @select_backedge() { entry: -- 2.34.1