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
64 lines
2.2 KiB
LLVM
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 }
|
|
|