[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:
Valentin Churavy 2019-12-14 10:33:30 -05:00
parent 049f9672d8
commit 5c29e8c65f
2 changed files with 22 additions and 0 deletions

View File

@ -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)),

View File

@ -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
}