[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