[LLVMbugs] [Bug 13756] New: segmentation fault in Loop Strength Reduction

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Sep 2 22:18:10 PDT 2012


             Bug #: 13756
           Summary: segmentation fault in Loop Strength Reduction
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: junyer at gmail.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 9147
  --> http://llvm.org/bugs/attachment.cgi?id=9147
an LLVM function that implements a DFA that recognises `.+' in UTF-8

In lib/Transforms/Scalar/LoopStrengthReduce.cpp, RewriteForPHI() doesn't handle
SplitCriticalEdge() returning NULL. I'm assuming that it's an edge case (pun
not intended) that you haven't encountered before, so I'm attaching code that
reproduces the bug, but it seems like the fix might be straightforward?

`llvm-as dotplus.ll -o=dotplus.bc' works.

`opt dotplus.bc -S -codegenprepare -mem2reg -loop-deletion' works.

`opt dotplus.bc -S -codegenprepare -mem2reg -loop-reduce' works.

`opt dotplus.bc -S -codegenprepare -mem2reg -loop-deletion -loop-reduce'

This patch simply stops LLVM from crashing, but might not be the ideal

--- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp.orig
+++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -4447,6 +4447,10 @@ void LSRInstance::RewriteForPHI(PHINode *PN,
            NewBB = SplitCriticalEdge(BB, Parent, P,
+            // It wasn't split, so it wasn't a critical edge after all.
+            // due to identical edges all from the same predecessor.
+            if (!NewBB)
+              goto no_split;
          } else {
            SmallVector<BasicBlock*, 2> NewBBs;
            SplitLandingPadPredecessors(Parent, BB, "", "", P, NewBBs);
@@ -4465,6 +4469,7 @@ void LSRInstance::RewriteForPHI(PHINode *PN,
          i = PN->getBasicBlockIndex(BB);
+    no_split:

      std::pair<DenseMap<BasicBlock *, Value *>::iterator, bool> Pair =
        Inserted.insert(std::make_pair(BB, static_cast<Value *>(0)));

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list