Skip to content

Commit

Permalink
[SimplifyCFG] Don't widen cond br if false branch has successors
Browse files Browse the repository at this point in the history
Fixes #57221.

This limits the tryWidenCondBranchToCondBranch transform making it
work only if the false block of widenable condition branch
has no successors.

If that block has successors, then SimplifyCondBranchToCondBranch
may undo the transform done by tryWidenCondBranchToCondBranch, which
would lead to infinite cycle of transformation and eventually
an assert failing.

Differential Revision: https://reviews.llvm.org/D132356
  • Loading branch information
d-makogon committed Aug 26, 2022
1 parent 5d82819 commit 9142f67
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
5 changes: 5 additions & 0 deletions llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3999,6 +3999,11 @@ static bool tryWidenCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
return false;
if (!IfFalseBB->phis().empty())
return false; // TODO
// This helps avoid infinite loop with SimplifyCondBranchToCondBranch which
// may undo the transform done here.
// TODO: There might be a more fine-grained solution to this.
if (!llvm::succ_empty(IfFalseBB))
return false;
// Use lambda to lazily compute expensive condition after cheap ones.
auto NoSideEffects = [](BasicBlock &BB) {
return llvm::none_of(BB, [](const Instruction &I) {
Expand Down
24 changes: 19 additions & 5 deletions llvm/test/Transforms/SimplifyCFG/pr52290.ll
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -simplifycfg -S | FileCheck %s
; RUN: opt < %s -passes=simplifycfg -S | FileCheck %s

; XFAIL: *
; REQUIRES: asserts
; FIXME: Fails due to infinite loop in iterativelySimplifyCFG.

; ModuleID = 'test/Transforms/SimplifyCFG/pr-new.ll'
source_filename = "test/Transforms/SimplifyCFG/pr-new.ll"

define i32 @test(float %arg, i1 %c) gc "statepoint-example" personality i32* ()* @blam {
; CHECK-LABEL: @test
; CHECK-LABEL: @test(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = call i1 @llvm.experimental.widenable.condition()
; CHECK-NEXT: br i1 [[TMP]], label [[BB2:%.*]], label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br i1 [[C:%.*]], label [[BB7:%.*]], label [[BB5:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, i8 addrspace(1)* undef, i64 16
; CHECK-NEXT: br i1 [[C]], label [[BB7]], label [[BB4:%.*]]
; CHECK: bb4:
; CHECK-NEXT: call void @snork() [ "deopt"() ]
; CHECK-NEXT: unreachable
; CHECK: bb5:
; CHECK-NEXT: ret i32 0
; CHECK: bb7:
; CHECK-NEXT: [[TMP8:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32(i32 10) [ "deopt"() ]
; CHECK-NEXT: ret i32 [[TMP8]]
;
bb:
%tmp = call i1 @llvm.experimental.widenable.condition()
br i1 %tmp, label %bb2, label %bb1
Expand Down

0 comments on commit 9142f67

Please sign in to comment.