diff --git a/llvm/include/llvm/Analysis/TargetTransformInfo.h b/llvm/include/llvm/Analysis/TargetTransformInfo.h --- a/llvm/include/llvm/Analysis/TargetTransformInfo.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfo.h @@ -268,9 +268,6 @@ ArrayRef Operands, TargetCostKind CostKind = TCK_SizeAndLatency) const; - /// Estimate the cost of a EXT operation when lowered. - int getExtCost(const Instruction *I, const Value *Src) const; - /// \returns A value by which our inlining threshold should be multiplied. /// This is primarily used to bump up the inlining threshold wholesale on /// targets where calls are unusually expensive. @@ -1232,7 +1229,6 @@ virtual int getGEPCost(Type *PointeeType, const Value *Ptr, ArrayRef Operands, TTI::TargetCostKind CostKind) = 0; - virtual int getExtCost(const Instruction *I, const Value *Src) = 0; virtual unsigned getInliningThresholdMultiplier() = 0; virtual int getInlinerVectorBonusPercent() = 0; virtual int getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, @@ -1493,9 +1489,6 @@ enum TargetTransformInfo::TargetCostKind CostKind) override { return Impl.getGEPCost(PointeeType, Ptr, Operands); } - int getExtCost(const Instruction *I, const Value *Src) override { - return Impl.getExtCost(I, Src); - } unsigned getInliningThresholdMultiplier() override { return Impl.getInliningThresholdMultiplier(); } diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h --- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -65,10 +65,6 @@ return SI.getNumCases(); } - int getExtCost(const Instruction *I, const Value *Src) { - return TTI::TCC_Basic; - } - unsigned getInliningThresholdMultiplier() { return 1; } int getInlinerVectorBonusPercent() { return 150; } @@ -866,7 +862,7 @@ case Instruction::FPExt: case Instruction::SExt: case Instruction::ZExt: - if (I && TargetTTI->getExtCost(I, Operands.back()) == TTI::TCC_Free) + if (TargetTTI->getCastInstrCost(Opcode, Ty, OpTy, CostKind, I) == TTI::TCC_Free) return TTI::TCC_Free; break; } diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -296,18 +296,6 @@ return BaseT::getGEPCost(PointeeType, Ptr, Operands); } - int getExtCost(const Instruction *I, const Value *Src) { - if (getTLI()->isExtFree(I)) - return TargetTransformInfo::TCC_Free; - - if (isa(I) || isa(I)) - if (const LoadInst *LI = dyn_cast(Src)) - if (getTLI()->isExtLoad(LI, I, DL)) - return TargetTransformInfo::TCC_Free; - - return TargetTransformInfo::TCC_Basic; - } - unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, ArrayRef Arguments, const User *U, TTI::TargetCostKind CostKind) { @@ -725,11 +713,21 @@ SrcSize == DstSize) return 0; break; + case Instruction::FPExt: + if (I && getTLI()->isExtFree(I)) + return 0; + break; case Instruction::ZExt: if (TLI->isZExtFree(SrcLT.second, DstLT.second)) return 0; LLVM_FALLTHROUGH; - case Instruction::SExt: { + case Instruction::SExt: + if (!I) + break; + + if (getTLI()->isExtFree(I)) + return 0; + // If this is a zext/sext of a load, return 0 if the corresponding // extending load exists on target. if (I && isa(I->getOperand(0))) { @@ -741,7 +739,6 @@ return 0; } break; - } case Instruction::AddrSpaceCast: if (TLI->isFreeAddrSpaceCast(Src->getPointerAddressSpace(), Dst->getPointerAddressSpace())) diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp --- a/llvm/lib/Analysis/TargetTransformInfo.cpp +++ b/llvm/lib/Analysis/TargetTransformInfo.cpp @@ -236,11 +236,6 @@ return TTIImpl->getGEPCost(PointeeType, Ptr, Operands, CostKind); } -int TargetTransformInfo::getExtCost(const Instruction *I, - const Value *Src) const { - return TTIImpl->getExtCost(I, Src); -} - int TargetTransformInfo::getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, ArrayRef Arguments, const User *U, diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp --- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp @@ -759,7 +759,7 @@ const Instruction *I) { assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode"); - int Cost = BaseT::getCastInstrCost(Opcode, Dst, Src, CostKind); + int Cost = BaseT::getCastInstrCost(Opcode, Dst, Src, CostKind, I); return vectorCostAdjustment(Cost, Opcode, Dst, Src); } diff --git a/llvm/test/Analysis/CostModel/AArch64/cast.ll b/llvm/test/Analysis/CostModel/AArch64/cast.ll --- a/llvm/test/Analysis/CostModel/AArch64/cast.ll +++ b/llvm/test/Analysis/CostModel/AArch64/cast.ll @@ -3,31 +3,31 @@ define i32 @casts_no_users() { ; CHECK-LABEL: 'casts_no_users' -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r0 = sext i1 undef to i8 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r1 = zext i1 undef to i8 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r2 = sext i1 undef to i16 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r3 = zext i1 undef to i16 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r4 = sext i1 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r5 = zext i1 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r6 = sext i1 undef to i64 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r0 = sext i1 undef to i8 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r1 = zext i1 undef to i8 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r2 = sext i1 undef to i16 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r3 = zext i1 undef to i16 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r4 = sext i1 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r5 = zext i1 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r6 = sext i1 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r7 = zext i1 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r8 = trunc i8 undef to i1 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r9 = sext i8 undef to i16 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r10 = zext i8 undef to i16 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r11 = sext i8 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r12 = zext i8 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r13 = sext i8 undef to i64 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r9 = sext i8 undef to i16 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r10 = zext i8 undef to i16 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r11 = sext i8 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r12 = zext i8 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r13 = sext i8 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r14 = zext i8 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r15 = trunc i16 undef to i1 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r16 = trunc i16 undef to i8 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r17 = sext i16 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r18 = zext i16 undef to i32 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r19 = sext i16 undef to i64 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r17 = sext i16 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r18 = zext i16 undef to i32 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r19 = sext i16 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r20 = zext i16 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r21 = trunc i32 undef to i1 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r22 = trunc i32 undef to i8 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r23 = trunc i32 undef to i16 -; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r24 = sext i32 undef to i64 +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r24 = sext i32 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r25 = zext i32 undef to i64 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r26 = trunc i64 undef to i1 ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %r27 = trunc i64 undef to i8