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: _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits