[PATCH] D66657: [CodegenPrepare] Guard against degenerate branches

Valentin Churavy via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 23 08:19:27 PDT 2019


vchuravy created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66657

Files:
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/test/CodeGen/X86/codegen-prepare-collapse.ll


Index: llvm/test/CodeGen/X86/codegen-prepare-collapse.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/codegen-prepare-collapse.ll
@@ -0,0 +1,15 @@
+; RUN: llc -fast-isel=true -O1 -mtriple=x86_64-unkown-linux-gnu -start-before=codegenprepare -stop-after=codegenprepare < %s
+
+define void @foo() {
+top:
+  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 occure and should not
+  ; lead to crashes.
+  br i1 %cond58, label %L34, label %L34
+}
Index: llvm/lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -7204,6 +7204,11 @@
     if (Br1->getMetadata(LLVMContext::MD_unpredictable))
       continue;
 
+    // The merging of mostly empty BB can cause a degenerate branch
+    if (TBB == FBB)
+        LLVM_DEBUG(dbgs() << "Don't split degenerate branch\n"; BB.dump());
+        continue;
+
     unsigned Opc;
     Value *Cond1, *Cond2;
     if (match(LogicOp, m_And(m_OneUse(m_Value(Cond1)),


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66657.216855.patch
Type: text/x-patch
Size: 1359 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190823/851331a5/attachment.bin>


More information about the llvm-commits mailing list