[llvm-branch-commits] [llvm-branch] r164492 - in /llvm/branches/R600: lib/Transforms/Scalar/LoopIdiomRecognize.cpp test/Transforms/LoopIdiom/non-canonical-loop.ll

Tom Stellard thomas.stellard at amd.com
Mon Sep 24 08:53:00 PDT 2012


Author: tstellar
Date: Mon Sep 24 10:51:22 2012
New Revision: 164492

URL: http://llvm.org/viewvc/llvm-project?rev=164492&view=rev
Log:
LoopIdiom: Give up when the loop is not in canonical form.

We rely on it when doing the transforms. This can happen when there is an
indirectbr in  the loop.

Fixes PR13892.

Added:
    llvm/branches/R600/test/Transforms/LoopIdiom/non-canonical-loop.ll
Modified:
    llvm/branches/R600/lib/Transforms/Scalar/LoopIdiomRecognize.cpp

Modified: llvm/branches/R600/lib/Transforms/Scalar/LoopIdiomRecognize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/R600/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=164492&r1=164491&r2=164492&view=diff
==============================================================================
--- llvm/branches/R600/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (original)
+++ llvm/branches/R600/lib/Transforms/Scalar/LoopIdiomRecognize.cpp Mon Sep 24 10:51:22 2012
@@ -175,6 +175,11 @@
 bool LoopIdiomRecognize::runOnLoop(Loop *L, LPPassManager &LPM) {
   CurLoop = L;
 
+  // If the loop could not be converted to canonical form, it must have an
+  // indirectbr in it, just give up.
+  if (!L->getLoopPreheader())
+    return false;
+
   // Disable loop idiom recognition if the function's name is a common idiom.
   StringRef Name = L->getHeader()->getParent()->getName();
   if (Name == "memset" || Name == "memcpy")

Added: llvm/branches/R600/test/Transforms/LoopIdiom/non-canonical-loop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/R600/test/Transforms/LoopIdiom/non-canonical-loop.ll?rev=164492&view=auto
==============================================================================
--- llvm/branches/R600/test/Transforms/LoopIdiom/non-canonical-loop.ll (added)
+++ llvm/branches/R600/test/Transforms/LoopIdiom/non-canonical-loop.ll Mon Sep 24 10:51:22 2012
@@ -0,0 +1,34 @@
+; RUN: opt -S -loop-idiom < %s
+; Don't crash
+; PR13892
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @test(i32* %currMB) nounwind uwtable {
+entry:
+  br i1 undef, label %start.exit, label %if.then.i
+
+if.then.i:                                        ; preds = %entry
+  unreachable
+
+start.exit:                       ; preds = %entry
+  indirectbr i8* undef, [label %0, label %for.bodyprime]
+
+; <label>:0                                       ; preds = %start.exit
+  unreachable
+
+for.bodyprime:                                    ; preds = %for.bodyprime, %start.exit
+  %i.057375 = phi i32 [ 0, %start.exit ], [ %1, %for.bodyprime ]
+  %arrayidx8prime = getelementptr inbounds i32* %currMB, i32 %i.057375
+  store i32 0, i32* %arrayidx8prime, align 4
+  %1 = add i32 %i.057375, 1
+  %cmp5prime = icmp slt i32 %1, 4
+  br i1 %cmp5prime, label %for.bodyprime, label %for.endprime
+
+for.endprime:                                     ; preds = %for.bodyprime
+  br label %for.body23prime
+
+for.body23prime:                                  ; preds = %for.body23prime, %for.endprime
+  br label %for.body23prime
+}





More information about the llvm-branch-commits mailing list