diff options
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 21 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-0.ll | 24 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-1.ll (renamed from llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll) | 10 | 
3 files changed, 43 insertions, 12 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index e9976c59971..f44729204a8 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1530,15 +1530,6 @@ namespace {  ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,                                                  IVStrideUse* &CondUse,                                                  const SCEVHandle* &CondStride) { -  // Forgo this transformation if the condition has multiple uses. This is -  // over-conservative, but simpler than alternatives. It guards against -  // comparisons with a use that occurs earlier than the add instruction for the -  // new stride index.  See -  // test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll -  // for an example of this situation. -  if (!Cond->hasOneUse()) -    return Cond; -    if (StrideOrder.size() < 2 ||        IVUsesByStride[*CondStride].Users.size() != 1)      return Cond; @@ -1653,6 +1644,18 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,      }    } +  // Forgo this transformation if it the increment happens to be +  // unfortunately positioned after the condition, and the condition +  // has multiple uses which prevent it from being moved immediately +  // before the branch. See +  // test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-*.ll +  // for an example of this situation. +  if (!Cond->hasOneUse()) +    for (BasicBlock::iterator I = Cond, E = Cond->getParent()->end(); +         I != E; ++I) +      if (I == NewIncV) +        return Cond; +    if (NewCmpVal != CmpVal) {      // Create a new compare instruction using new stride / iv.      ICmpInst *OldCond = Cond; diff --git a/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-0.ll b/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-0.ll new file mode 100644 index 00000000000..33b05221511 --- /dev/null +++ b/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-0.ll @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | llc --x86-asm-syntax=att | grep {cmpl	\$4} +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" +target triple = "x86_64-apple-darwin9" + +; This is like change-compare-stride-trickiness-1.ll except the comparison +; happens before the relevant use, so the comparison stride can't be +; easily changed. + +define void @foo() { +entry: +	br label %loop + +loop: +	%indvar = phi i32 [ 0, %entry ], [ %i.2.0.us1534, %loop ]		; <i32> [#uses=1] +	%i.2.0.us1534 = add i32 %indvar, 1		; <i32> [#uses=3] +	%tmp611.us1535 = icmp eq i32 %i.2.0.us1534, 4		; <i1> [#uses=2] +	%tmp623.us1538 = select i1 %tmp611.us1535, i32 6, i32 0		; <i32> [#uses=0] +	%tmp628.us1540 = shl i32 %i.2.0.us1534, 1		; <i32> [#uses=1] +	%tmp645646647.us1547 = sext i32 %tmp628.us1540 to i64		; <i64> [#uses=0] +	br i1 %tmp611.us1535, label %exit, label %loop + +exit: +	ret void +} diff --git a/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll b/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-1.ll index 9a54b7be1f5..06e231212ed 100644 --- a/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness.ll +++ b/llvm/test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-1.ll @@ -1,7 +1,11 @@ -; RUN: llvm-as < %s | llc +; RUN: llvm-as < %s | llc --x86-asm-syntax=att | grep {cmpl	\$8}  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"  target triple = "x86_64-apple-darwin9" +; This is like change-compare-stride-trickiness-0.ll except the comparison +; happens after the relevant use, so the comparison stride can be +; easily changed. +  define void @foo() {  entry:  	br label %loop @@ -9,10 +13,10 @@ entry:  loop:  	%indvar = phi i32 [ 0, %entry ], [ %i.2.0.us1534, %loop ]		; <i32> [#uses=1]  	%i.2.0.us1534 = add i32 %indvar, 1		; <i32> [#uses=3] -	%tmp611.us1535 = icmp eq i32 %i.2.0.us1534, 4		; <i1> [#uses=2] -	%tmp623.us1538 = select i1 %tmp611.us1535, i32 6, i32 0		; <i32> [#uses=0]  	%tmp628.us1540 = shl i32 %i.2.0.us1534, 1		; <i32> [#uses=1]  	%tmp645646647.us1547 = sext i32 %tmp628.us1540 to i64		; <i64> [#uses=0] +	%tmp611.us1535 = icmp eq i32 %i.2.0.us1534, 4		; <i1> [#uses=2] +	%tmp623.us1538 = select i1 %tmp611.us1535, i32 6, i32 0		; <i32> [#uses=0]  	br i1 %tmp611.us1535, label %exit, label %loop  exit: | 

