[llvm-branch-commits] [llvm] 3d0d76a - Revert "[SimplifyCFG] Skip threading if the target may have divergent branches"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jul 29 02:22:01 PDT 2024
Author: Jan Patrick Lehr
Date: 2024-07-29T11:21:59+02:00
New Revision: 3d0d76ac0e63b665dce30ddd9ddc0dbfd4c5518c
URL: https://github.com/llvm/llvm-project/commit/3d0d76ac0e63b665dce30ddd9ddc0dbfd4c5518c
DIFF: https://github.com/llvm/llvm-project/commit/3d0d76ac0e63b665dce30ddd9ddc0dbfd4c5518c.diff
LOG: Revert "[SimplifyCFG] Skip threading if the target may have divergent branches"
This reverts commit ba45453c0a5df3e6c3eddee647e14c97e02243fa.
Added:
Modified:
llvm/lib/Transforms/Utils/SimplifyCFG.cpp
llvm/test/Transforms/SimplifyCFG/convergent.ll
Removed:
llvm/test/Transforms/SimplifyCFG/AMDGPU/skip-threading.ll
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 1a17524b826a1..f23e28888931d 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3246,12 +3246,7 @@ bool SimplifyCFGOpt::SpeculativelyExecuteBB(BranchInst *BI,
}
/// Return true if we can thread a branch across this block.
-static bool BlockIsSimpleEnoughToThreadThrough(BasicBlock *BB,
- const TargetTransformInfo &TTI) {
- // Skip threading if the branch may be divergent.
- if (TTI.hasBranchDivergence(BB->getParent()))
- return false;
-
+static bool BlockIsSimpleEnoughToThreadThrough(BasicBlock *BB) {
int Size = 0;
EphemeralValueTracker EphTracker;
@@ -3306,9 +3301,10 @@ static ConstantInt *getKnownValueOnEdge(Value *V, BasicBlock *From,
/// If we have a conditional branch on something for which we know the constant
/// value in predecessors (e.g. a phi node in the current block), thread edges
/// from the predecessor to their ultimate destination.
-static std::optional<bool> FoldCondBranchOnValueKnownInPredecessorImpl(
- BranchInst *BI, DomTreeUpdater *DTU, const DataLayout &DL,
- const TargetTransformInfo &TTI, AssumptionCache *AC) {
+static std::optional<bool>
+FoldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
+ const DataLayout &DL,
+ AssumptionCache *AC) {
SmallMapVector<ConstantInt *, SmallSetVector<BasicBlock *, 2>, 2> KnownValues;
BasicBlock *BB = BI->getParent();
Value *Cond = BI->getCondition();
@@ -3336,7 +3332,7 @@ static std::optional<bool> FoldCondBranchOnValueKnownInPredecessorImpl(
// Now we know that this block has multiple preds and two succs.
// Check that the block is small enough and values defined in the block are
// not used outside of it.
- if (!BlockIsSimpleEnoughToThreadThrough(BB, TTI))
+ if (!BlockIsSimpleEnoughToThreadThrough(BB))
return false;
for (const auto &Pair : KnownValues) {
@@ -3463,14 +3459,15 @@ static std::optional<bool> FoldCondBranchOnValueKnownInPredecessorImpl(
return false;
}
-static bool FoldCondBranchOnValueKnownInPredecessor(
- BranchInst *BI, DomTreeUpdater *DTU, const DataLayout &DL,
- const TargetTransformInfo &TTI, AssumptionCache *AC) {
+static bool FoldCondBranchOnValueKnownInPredecessor(BranchInst *BI,
+ DomTreeUpdater *DTU,
+ const DataLayout &DL,
+ AssumptionCache *AC) {
std::optional<bool> Result;
bool EverChanged = false;
do {
// Note that None means "we changed things, but recurse further."
- Result = FoldCondBranchOnValueKnownInPredecessorImpl(BI, DTU, DL, TTI, AC);
+ Result = FoldCondBranchOnValueKnownInPredecessorImpl(BI, DTU, DL, AC);
EverChanged |= Result == std::nullopt || *Result;
} while (Result == std::nullopt);
return EverChanged;
@@ -7546,7 +7543,7 @@ bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
// If this is a branch on something for which we know the constant value in
// predecessors (e.g. a phi node in the current block), thread control
// through this block.
- if (FoldCondBranchOnValueKnownInPredecessor(BI, DTU, DL, TTI, Options.AC))
+ if (FoldCondBranchOnValueKnownInPredecessor(BI, DTU, DL, Options.AC))
return requestResimplify();
// Scan predecessor blocks for conditional branches.
diff --git a/llvm/test/Transforms/SimplifyCFG/AMDGPU/skip-threading.ll b/llvm/test/Transforms/SimplifyCFG/AMDGPU/skip-threading.ll
deleted file mode 100644
index b1262e294c6d0..0000000000000
--- a/llvm/test/Transforms/SimplifyCFG/AMDGPU/skip-threading.ll
+++ /dev/null
@@ -1,44 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt -mtriple=amdgcn -S -passes=simplifycfg < %s | FileCheck %s
-
-declare void @bar1()
-declare void @bar2()
-declare void @bar3()
-
-define i32 @test_01a(i32 %a) {
-; CHECK-LABEL: define i32 @test_01a(
-; CHECK-SAME: i32 [[A:%.*]]) {
-; CHECK-NEXT: [[ENTRY:.*:]]
-; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A]], 0
-; CHECK-NEXT: br i1 [[COND]], label %[[MERGE:.*]], label %[[IF_FALSE:.*]]
-; CHECK: [[IF_FALSE]]:
-; CHECK-NEXT: call void @bar1()
-; CHECK-NEXT: br label %[[MERGE]]
-; CHECK: [[MERGE]]:
-; CHECK-NEXT: call void @bar2()
-; CHECK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[IF_FALSE_2:.*]]
-; CHECK: [[IF_FALSE_2]]:
-; CHECK-NEXT: call void @bar3()
-; CHECK-NEXT: br label %[[EXIT]]
-; CHECK: [[EXIT]]:
-; CHECK-NEXT: ret i32 [[A]]
-;
-entry:
- %cond = icmp eq i32 %a, 0
- br i1 %cond, label %merge, label %if.false
-
-if.false:
- call void @bar1()
- br label %merge
-
-merge:
- call void @bar2()
- br i1 %cond, label %exit, label %if.false.2
-
-if.false.2:
- call void @bar3()
- br label %exit
-
-exit:
- ret i32 %a
-}
diff --git a/llvm/test/Transforms/SimplifyCFG/convergent.ll b/llvm/test/Transforms/SimplifyCFG/convergent.ll
index d148063589de6..6ba51e06460c2 100644
--- a/llvm/test/Transforms/SimplifyCFG/convergent.ll
+++ b/llvm/test/Transforms/SimplifyCFG/convergent.ll
@@ -4,9 +4,6 @@
; RUN: opt -S -passes='simplifycfg<hoist-common-insts;sink-common-insts>' < %s | FileCheck -check-prefixes=CHECK,SINK %s
declare void @foo() convergent
-declare void @bar1()
-declare void @bar2()
-declare void @bar3()
declare i32 @tid()
declare i32 @mbcnt(i32 %a, i32 %b) convergent
declare i32 @bpermute(i32 %a, i32 %b) convergent
@@ -48,42 +45,6 @@ exit:
ret i32 %a
}
-define i32 @test_01a(i32 %a) {
-; CHECK-LABEL: @test_01a(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 0
-; CHECK-NEXT: br i1 [[COND]], label [[EXIT_CRITEDGE:%.*]], label [[IF_FALSE:%.*]]
-; CHECK: if.false:
-; CHECK-NEXT: call void @bar1()
-; CHECK-NEXT: call void @bar2()
-; CHECK-NEXT: call void @bar3()
-; CHECK-NEXT: br label [[EXIT:%.*]]
-; CHECK: exit.critedge:
-; CHECK-NEXT: call void @bar2()
-; CHECK-NEXT: br label [[EXIT]]
-; CHECK: exit:
-; CHECK-NEXT: ret i32 [[A]]
-;
-entry:
- %cond = icmp eq i32 %a, 0
- br i1 %cond, label %merge, label %if.false
-
-if.false:
- call void @bar1()
- br label %merge
-
-merge:
- call void @bar2()
- br i1 %cond, label %exit, label %if.false.2
-
-if.false.2:
- call void @bar3()
- br label %exit
-
-exit:
- ret i32 %a
-}
-
define void @test_02(ptr %y.coerce) convergent {
; NOSINK-LABEL: @test_02(
; NOSINK-NEXT: entry:
More information about the llvm-branch-commits
mailing list