Dmitry Makogon 9142f67ef2 [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
2022-08-26 15:23:37 +07:00

64 lines
2.2 KiB
LLVM

; 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
; 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-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
bb1: ; preds = %bb
br i1 %c, label %bb7, label %bb5
bb2: ; preds = %bb
%tmp3 = getelementptr inbounds i8, i8 addrspace(1)* undef, i64 16
br i1 %c, label %bb6, label %bb4
bb4: ; preds = %bb2
call void @snork() [ "deopt"() ]
unreachable
bb5: ; preds = %bb1
ret i32 0
bb6: ; preds = %bb2
br label %bb7
bb7: ; preds = %bb6, %bb1
%tmp8 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 10) [ "deopt"() ]
ret i32 %tmp8
}
declare i32* @blam()
declare void @snork()
declare i32 @llvm.experimental.deoptimize.i32(...)
; Function Attrs: inaccessiblememonly nofree nosync nounwind speculatable willreturn
declare i1 @llvm.experimental.widenable.condition() #0
attributes #0 = { inaccessiblememonly nofree nosync nounwind speculatable willreturn }