mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Don't (unconditionally) use getSCEVAtScope to simplify the step
expression in IVUsers, because in the case of a use of a non-linear addrec outside of a loop, this causes the addrec to be evaluated as a linear addrec. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73774 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ae60c0f78e
commit
958e292c7a
@ -112,7 +112,6 @@ static bool getSCEVStartAndStride(const SCEVHandle &SH, Loop *L, Loop *UseLoop,
|
||||
SCEVHandle AddRecStart = AddRec->getStart();
|
||||
AddRecStart = SE->getSCEVAtScope(AddRecStart, UseLoop);
|
||||
SCEVHandle AddRecStride = AddRec->getStepRecurrence(*SE);
|
||||
AddRecStride = SE->getSCEVAtScope(AddRecStride, UseLoop);
|
||||
|
||||
// FIXME: If Start contains an SCEVAddRecExpr from a different loop, other
|
||||
// than an outer loop of the current loop, reject it. LSR has no concept of
|
||||
|
18
test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll
Normal file
18
test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llvm-as < %s | opt -analyze -iv-users -disable-output | grep {Stride i64 {1,+,2}<loop>:}
|
||||
|
||||
; The value of %r is dependent on a polynomial iteration expression.
|
||||
|
||||
define i64 @foo(i64 %n) {
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]
|
||||
%indvar.next = add i64 %indvar, 1
|
||||
%c = icmp eq i64 %indvar.next, %n
|
||||
br i1 %c, label %exit, label %loop
|
||||
|
||||
exit:
|
||||
%r = mul i64 %indvar, %indvar
|
||||
ret i64 %r
|
||||
}
|
Loading…
Reference in New Issue
Block a user