forked from OSchip/llvm-project
[CodegenPrepare] Guard against degenerate branches
Summary: Guard against a potential crash observed in https://github.com/JuliaLang/julia/issues/32994#issuecomment-524249628 If two branches are collapsed we can encounter a degenerate conditional branch `TBB==FBB`. The subsequent code assumes that they differ, so we exit out early. Reviewers: ributzka, spatel Subscribers: loladiro, dexonsmith, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66657
This commit is contained in:
parent
049f9672d8
commit
5c29e8c65f
|
@ -7345,6 +7345,10 @@ bool CodeGenPrepare::splitBranchCondition(Function &F, bool &ModifiedDT) {
|
|||
if (Br1->getMetadata(LLVMContext::MD_unpredictable))
|
||||
continue;
|
||||
|
||||
// The merging of mostly empty BB can cause a degenerate branch.
|
||||
if (TBB == FBB)
|
||||
continue;
|
||||
|
||||
unsigned Opc;
|
||||
Value *Cond1, *Cond2;
|
||||
if (match(LogicOp, m_And(m_OneUse(m_Value(Cond1)),
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
; RUN: llc -fast-isel=true -O1 -mtriple=x86_64-unkown-linux-gnu -start-before=codegenprepare -stop-after=codegenprepare -o - < %s | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: @foo
|
||||
define void @foo() {
|
||||
top:
|
||||
; CHECK: br label %L34
|
||||
br label %L34
|
||||
|
||||
L34: ; preds = %L34, %L34, %top
|
||||
%.sroa.075.0 = phi i64 [ undef, %top ], [ undef, %L34 ], [ undef, %L34 ]
|
||||
%0 = icmp sgt i8 undef, -1
|
||||
%cond5896 = icmp eq i8 0, 2
|
||||
%cond58 = and i1 %cond5896, %0
|
||||
; During codegenprepare such degenerate branches can occur and should not
|
||||
; lead to crashes.
|
||||
; CHECK: br label %L34
|
||||
br i1 %cond58, label %L34, label %L34
|
||||
}
|
Loading…
Reference in New Issue