[llvm] 5c29e8c - [CodegenPrepare] Guard against degenerate branches

Valentin Churavy via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 16 01:25:11 PST 2019


Author: Valentin Churavy
Date: 2019-12-16T04:23:32-05:00
New Revision: 5c29e8c65fe372b0239f32b38a0299d9abef3167

URL: https://github.com/llvm/llvm-project/commit/5c29e8c65fe372b0239f32b38a0299d9abef3167
DIFF: https://github.com/llvm/llvm-project/commit/5c29e8c65fe372b0239f32b38a0299d9abef3167.diff

LOG: [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

Added: 
    llvm/test/CodeGen/X86/codegen-prepare-collapse.ll

Modified: 
    llvm/lib/CodeGen/CodeGenPrepare.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 0f44b8f69b78..f05afd058746 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -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)),

diff  --git a/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll b/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll
new file mode 100644
index 000000000000..18e3ef7afbd1
--- /dev/null
+++ b/llvm/test/CodeGen/X86/codegen-prepare-collapse.ll
@@ -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
+}


        


More information about the llvm-commits mailing list