Index: include/llvm/Target/TargetLowering.h =================================================================== --- include/llvm/Target/TargetLowering.h +++ include/llvm/Target/TargetLowering.h @@ -1462,10 +1462,16 @@ return false; } - /// Return true if it's free to truncate a value of type Ty1 to type - /// Ty2. e.g. On x86 it's free to truncate a i32 value in register EAX to i16 + /// Return true if it's free to truncate a value of type FromTy to type + /// ToTy. e.g. On x86 it's free to truncate a i32 value in register EAX to i16 /// by referencing its sub-register AX. - virtual bool isTruncateFree(Type * /*Ty1*/, Type * /*Ty2*/) const { + virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const { + unsigned FromNumBits = FromTy->getPrimitiveSizeInBits(); + unsigned ToNumBits = ToTy->getPrimitiveSizeInBits(); + assert((FromNumBits > ToNumBits) + && "Can't truncate from small to large."); + (void)FromNumBits; // silence -Wunused + (void)ToNumBits; return false; } @@ -1478,7 +1484,13 @@ return false; } - virtual bool isTruncateFree(EVT /*VT1*/, EVT /*VT2*/) const { + virtual bool isTruncateFree(EVT FromVT, EVT ToVT) const { + unsigned FromNumBits = FromVT.getSizeInBits(); + unsigned ToNumBits = ToVT.getSizeInBits(); + assert((FromNumBits > ToNumBits) + && "Can't truncate from small to large."); + (void)FromNumBits; // silence -Wunused + (void)ToNumBits; return false; } Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -9149,8 +9149,9 @@ void addSliceGain(const LoadedSlice &LS) { // Each slice saves a truncate. const TargetLowering &TLI = LS.DAG->getTargetLoweringInfo(); - if (!TLI.isTruncateFree(LS.Inst->getValueType(0), - LS.Inst->getOperand(0).getValueType())) + // isTruncateFree(FromType,ToType) + if (!TLI.isTruncateFree(LS.Inst->getOperand(0).getValueType(), + LS.Inst->getValueType(0))) ++Truncates; // If there is a shift amount, this slice gets rid of it. if (LS.Shift)