forked from OSchip/llvm-project
[SimplifyCFG] Don't widen cond br if false branch has successors
Fixes https://github.com/llvm/llvm-project/issues/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
This commit is contained in:
parent
5d82819583
commit
9142f67ef2
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue