Skip to content

Commit ddffb74

Browse files
authored
[LV] Strip unreachable SCEV-check blocks (#130079)
emitSCEVChecks checks if SCEVCheckCond matches zero, and returns nullptr. However, it sets SCEVCheckCond as used before it does this, which prevents it from being removed during cleanup, resulting in unreachable blocks being emitted. Fix this.
1 parent 00f3089 commit ddffb74

File tree

3 files changed

+7
-16
lines changed

3 files changed

+7
-16
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2094,18 +2094,11 @@ class GeneratedRTChecks {
20942094
/// depending on the generated condition.
20952095
BasicBlock *emitSCEVChecks(BasicBlock *Bypass,
20962096
BasicBlock *LoopVectorPreHeader) {
2097-
if (!SCEVCheckCond)
2097+
using namespace llvm::PatternMatch;
2098+
if (!SCEVCheckCond || match(SCEVCheckCond, m_ZeroInt()))
20982099
return nullptr;
20992100

2100-
Value *Cond = SCEVCheckCond;
2101-
// Mark the check as used, to prevent it from being removed during cleanup.
2102-
SCEVCheckCond = nullptr;
2103-
if (auto *C = dyn_cast<ConstantInt>(Cond))
2104-
if (C->isZero())
2105-
return nullptr;
2106-
21072101
auto *Pred = LoopVectorPreHeader->getSinglePredecessor();
2108-
21092102
BranchInst::Create(LoopVectorPreHeader, SCEVCheckBlock);
21102103
// Create new preheader for vector loop.
21112104
if (OuterLoop)
@@ -2119,10 +2112,14 @@ class GeneratedRTChecks {
21192112
DT->addNewBlock(SCEVCheckBlock, Pred);
21202113
DT->changeImmediateDominator(LoopVectorPreHeader, SCEVCheckBlock);
21212114

2122-
BranchInst &BI = *BranchInst::Create(Bypass, LoopVectorPreHeader, Cond);
2115+
BranchInst &BI =
2116+
*BranchInst::Create(Bypass, LoopVectorPreHeader, SCEVCheckCond);
21232117
if (AddBranchWeights)
21242118
setBranchWeights(BI, SCEVCheckBypassWeights, /*IsExpected=*/false);
21252119
ReplaceInstWithInst(SCEVCheckBlock->getTerminator(), &BI);
2120+
2121+
// Mark the check as used, to prevent it from being removed during cleanup.
2122+
SCEVCheckCond = nullptr;
21262123
return SCEVCheckBlock;
21272124
}
21282125

llvm/test/Transforms/LoopVectorize/AArch64/conditional-branches-cost.ll

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -793,8 +793,6 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
793793
; DEFAULT-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
794794
; DEFAULT-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ 512, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
795795
; DEFAULT-NEXT: br label [[LOOP:%.*]]
796-
; DEFAULT: vector.scevcheck:
797-
; DEFAULT-NEXT: unreachable
798796
; DEFAULT: loop:
799797
; DEFAULT-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]
800798
; DEFAULT-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -857,8 +855,6 @@ define void @multiple_exit_conditions(ptr %src, ptr noalias %dst) #1 {
857855
; PRED-NEXT: [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[DST]], [[ENTRY:%.*]] ]
858856
; PRED-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ [[IND_END1]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
859857
; PRED-NEXT: br label [[LOOP:%.*]]
860-
; PRED: vector.scevcheck:
861-
; PRED-NEXT: unreachable
862858
; PRED: loop:
863859
; PRED-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP]] ]
864860
; PRED-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL2]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]

llvm/test/Transforms/LoopVectorize/X86/pr36524.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ define void @foo(ptr %ptr, ptr %ptr.2) {
4040
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 80, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ]
4141
; CHECK-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i64 [ 82, [[MIDDLE_BLOCK]] ], [ 2, [[ENTRY]] ], [ 2, [[VECTOR_MEMCHECK]] ]
4242
; CHECK-NEXT: br label [[LOOP:%.*]]
43-
; CHECK: vector.scevcheck:
44-
; CHECK-NEXT: unreachable
4543
; CHECK: loop:
4644
; CHECK-NEXT: [[CAN_IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[CAN_IV_NEXT:%.*]], [[LOOP]] ]
4745
; CHECK-NEXT: [[TMP9:%.*]] = phi i64 [ [[BC_RESUME_VAL2]], [[SCALAR_PH]] ], [ [[TMP12:%.*]], [[LOOP]] ]

0 commit comments

Comments
 (0)