mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
[indvars] Fix PR10946: SCEV cannot handle Vector IVs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140026 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9883acd2a6
commit
24f48ece52
@ -85,6 +85,8 @@ namespace {
|
|||||||
/// foldIVUser - Fold an IV operand into its use. This removes increments of an
|
/// foldIVUser - Fold an IV operand into its use. This removes increments of an
|
||||||
/// aligned IV when used by a instruction that ignores the low bits.
|
/// aligned IV when used by a instruction that ignores the low bits.
|
||||||
///
|
///
|
||||||
|
/// IVOperand is guaranteed SCEVable, but UseInst may not be.
|
||||||
|
///
|
||||||
/// Return the operand of IVOperand for this induction variable if IVOperand can
|
/// Return the operand of IVOperand for this induction variable if IVOperand can
|
||||||
/// be folded (in case more folding opportunities have been exposed).
|
/// be folded (in case more folding opportunities have been exposed).
|
||||||
/// Otherwise return null.
|
/// Otherwise return null.
|
||||||
@ -241,6 +243,7 @@ void SimplifyIndvar::eliminateIVRemainder(BinaryOperator *Rem,
|
|||||||
|
|
||||||
/// eliminateIVUser - Eliminate an operation that consumes a simple IV and has
|
/// eliminateIVUser - Eliminate an operation that consumes a simple IV and has
|
||||||
/// no observable side-effect given the range of IV values.
|
/// no observable side-effect given the range of IV values.
|
||||||
|
/// IVOperand is guaranteed SCEVable, but UseInst may not be.
|
||||||
bool SimplifyIndvar::eliminateIVUser(Instruction *UseInst,
|
bool SimplifyIndvar::eliminateIVUser(Instruction *UseInst,
|
||||||
Instruction *IVOperand) {
|
Instruction *IVOperand) {
|
||||||
if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
|
if (ICmpInst *ICmp = dyn_cast<ICmpInst>(UseInst)) {
|
||||||
@ -324,6 +327,9 @@ static bool isSimpleIVUser(Instruction *I, const Loop *L, ScalarEvolution *SE) {
|
|||||||
/// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
|
/// Once DisableIVRewrite is default, LSR will be the only client of IVUsers.
|
||||||
///
|
///
|
||||||
void SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) {
|
void SimplifyIndvar::simplifyUsers(PHINode *CurrIV, IVVisitor *V) {
|
||||||
|
if (!SE->isSCEVable(CurrIV->getType()))
|
||||||
|
return;
|
||||||
|
|
||||||
// Instructions processed by SimplifyIndvar for CurrIV.
|
// Instructions processed by SimplifyIndvar for CurrIV.
|
||||||
SmallPtrSet<Instruction*,16> Simplified;
|
SmallPtrSet<Instruction*,16> Simplified;
|
||||||
|
|
||||||
|
16
test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll
Normal file
16
test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
; RUN: opt < %s -indvars -S | FileCheck %s
|
||||||
|
; PR10946: Vector IVs are not SCEVable.
|
||||||
|
; CHECK-NOT: phi
|
||||||
|
define void @test() nounwind {
|
||||||
|
allocas:
|
||||||
|
br i1 undef, label %cif_done, label %for_loop398
|
||||||
|
|
||||||
|
cif_done: ; preds = %allocas
|
||||||
|
ret void
|
||||||
|
|
||||||
|
for_loop398: ; preds = %for_loop398, %allocas
|
||||||
|
%storemerge35 = phi <4 x i32> [ %storemerge, %for_loop398 ], [ undef, %allocas ]
|
||||||
|
%bincmp431 = icmp sge <4 x i32> %storemerge35, <i32 5, i32 5, i32 5, i32 5>
|
||||||
|
%storemerge = bitcast <4 x float> undef to <4 x i32>
|
||||||
|
br label %for_loop398
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user