[llvm-commits] [llvm] r52440 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/sext-misc.ll
Chris Lattner
clattner at apple.com
Wed Jun 18 10:23:30 PDT 2008
Will do, sorry for the breakage!
On Jun 18, 2008, at 9:14 AM, Dan Gohman wrote:
> Hi Chris
>
> sext-misc.ll now fails with three sext instructions that aren't
> being eliminated that previously were. Can you investigate?
>
> Thanks,
>
> Dan
>
> On Tue, June 17, 2008 9:00 pm, Chris Lattner wrote:
>> Author: lattner
>> Date: Tue Jun 17 23:00:49 2008
>> New Revision: 52440
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=52440&view=rev
>> Log:
>> make truncate/sext elimination capable of changing phi's. This
>> implements rdar://6013816 and the testcase in
>> Transforms/InstCombine/sext-misc.ll.
>>
>> Modified:
>> llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
>> llvm/trunk/test/Transforms/InstCombine/sext-misc.ll
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=52440&r1=52439&r2=52440&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
>> (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Tue
>> Jun 17
>> 23:00:49 2008
>> @@ -6838,6 +6838,16 @@
>> ///
>> /// This is a truncation operation if Ty is smaller than V-
>> >getType(), or
>> an
>> /// extension operation if Ty is larger.
>> +///
>> +/// If CastOpc is a truncation, then Ty will be a type smaller
>> than V.
>> We
>> +/// should return true if trunc(V) can be computed by computing V
>> in the
>> smaller
>> +/// type. If V is an instruction, then trunc(inst(x,y)) can be
>> computed
>> as
>> +/// inst(trunc(x),trunc(y)), which only makes sense if x and y can
>> be
>> +/// efficiently truncated.
>> +///
>> +/// If CastOpc is a sext or zext, we are asking if the low bits of
>> the
>> value can
>> +/// bit computed in a larger type, which is then and'd or
>> sext_in_reg'd
>> to get
>> +/// the final result.
>> bool InstCombiner::CanEvaluateInDifferentType(Value *V, const
>> IntegerType
>> *Ty,
>> unsigned CastOpc,
>> int &NumCastsRemoved) {
>> @@ -6858,7 +6868,7 @@
>> // If the first operand is itself a cast, and is eliminable,
>> do not
>> count
>> // this as an eliminable cast. We would prefer to eliminate
>> those
>> two
>> // casts first.
>> - if (!isa<CastInst>(I->getOperand(0)))
>> + if (!isa<CastInst>(I->getOperand(0)) && I->hasOneUse())
>> ++NumCastsRemoved;
>> return true;
>> }
>> @@ -6923,8 +6933,17 @@
>> // of casts in the input.
>> if (I->getOpcode() == CastOpc)
>> return true;
>> -
>> break;
>> +
>> + case Instruction::PHI: {
>> + // We can change a phi if we can change all operands.
>> + PHINode *PN = cast<PHINode>(I);
>> + for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; +
>> +i)
>> + if (!CanEvaluateInDifferentType(PN->getIncomingValue(i), Ty,
>> CastOpc,
>> + NumCastsRemoved))
>> + return false;
>> + return true;
>> + }
>> default:
>> // TODO: Can handle more cases here.
>> break;
>> @@ -6957,7 +6976,7 @@
>> Value *LHS = EvaluateInDifferentType(I->getOperand(0), Ty,
>> isSigned);
>> Value *RHS = EvaluateInDifferentType(I->getOperand(1), Ty,
>> isSigned);
>> Res = BinaryOperator::Create((Instruction::BinaryOps)I-
>> >getOpcode(),
>> - LHS, RHS, I->getName());
>> + LHS, RHS);
>> break;
>> }
>> case Instruction::Trunc:
>> @@ -6969,16 +6988,27 @@
>> if (I->getOperand(0)->getType() == Ty)
>> return I->getOperand(0);
>>
>> - // Otherwise, must be the same type of case, so just reinsert
>> a new
>> one.
>> + // Otherwise, must be the same type of cast, so just reinsert
>> a new
>> one.
>> Res = CastInst::Create(cast<CastInst>(I)->getOpcode(),
>> I->getOperand(0),
>> - Ty, I->getName());
>> + Ty);
>> break;
>> + case Instruction::PHI: {
>> + PHINode *OPN = cast<PHINode>(I);
>> + PHINode *NPN = PHINode::Create(Ty);
>> + for (unsigned i = 0, e = OPN->getNumIncomingValues(); i != e; +
>> +i) {
>> + Value *V =EvaluateInDifferentType(OPN->getIncomingValue(i),
>> Ty,
>> isSigned);
>> + NPN->addIncoming(V, OPN->getIncomingBlock(i));
>> + }
>> + Res = NPN;
>> + break;
>> + }
>> default:
>> // TODO: Can handle more cases here.
>> assert(0 && "Unreachable!");
>> break;
>> }
>>
>> + Res->takeName(I);
>> return InsertNewInstBefore(Res, *I);
>> }
>>
>>
>> Modified: llvm/trunk/test/Transforms/InstCombine/sext-misc.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sext-misc.ll?rev=52440&r1=52439&r2=52440&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/test/Transforms/InstCombine/sext-misc.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/sext-misc.ll Tue Jun 17
>> 23:00:49 2008
>> @@ -1,6 +1,4 @@
>> ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep sext
>> -; RUN: llvm-as < %s | llc -march=x86-64 | not grep movslq
>> -; RUN: llvm-as < %s | llc -march=x86 | not grep sar
>>
>> declare i32 @llvm.ctpop.i32(i32)
>> declare i32 @llvm.ctlz.i32(i32)
>> @@ -50,3 +48,18 @@
>> %n = sext i16 %s to i32
>> ret i32 %n
>> }
>> +
>> +; rdar://6013816
>> +define i16 @test(i16 %t, i1 %cond) nounwind {
>> +entry:
>> + br i1 %cond, label %T, label %F
>> +T:
>> + %t2 = sext i16 %t to i32
>> + br label %F
>> +
>> +F:
>> + %V = phi i32 [%t2, %T], [42, %entry]
>> + %W = trunc i32 %V to i16
>> + ret i16 %W
>> +}
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list