From 858e9f083d03052fdec5d8c22b3ac61ab5624163 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Thu, 21 Jul 2011 01:05:01 +0000 Subject: LSR must sometimes sign-extend before generating double constants. rdar://9786536 llvm-svn: 135650 --- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Transforms/Scalar') diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 4598df0c428..92864817aee 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1427,6 +1427,7 @@ void LSRInstance::OptimizeShadowIV() { ++UI; Instruction *ShadowUse = CandidateUI->getUser(); Type *DestTy = NULL; + bool IsSigned = false; /* If shadow use is a int->float cast then insert a second IV to eliminate this cast. @@ -1440,10 +1441,14 @@ void LSRInstance::OptimizeShadowIV() { for (unsigned i = 0; i < n; ++i, ++d) foo(d); */ - if (UIToFPInst *UCast = dyn_cast(CandidateUI->getUser())) + if (UIToFPInst *UCast = dyn_cast(CandidateUI->getUser())) { + IsSigned = false; DestTy = UCast->getDestTy(); - else if (SIToFPInst *SCast = dyn_cast(CandidateUI->getUser())) + } + else if (SIToFPInst *SCast = dyn_cast(CandidateUI->getUser())) { + IsSigned = true; DestTy = SCast->getDestTy(); + } if (!DestTy) continue; if (TLI) { @@ -1474,7 +1479,9 @@ void LSRInstance::OptimizeShadowIV() { ConstantInt *Init = dyn_cast(PH->getIncomingValue(Entry)); if (!Init) continue; - Constant *NewInit = ConstantFP::get(DestTy, Init->getZExtValue()); + Constant *NewInit = ConstantFP::get(DestTy, IsSigned ? + Init->getSExtValue() : + Init->getZExtValue()); BinaryOperator *Incr = dyn_cast(PH->getIncomingValue(Latch)); -- cgit v1.2.3