diff --git a/llvm/lib/Target/Lanai/LanaiTargetTransformInfo.h b/llvm/lib/Target/Lanai/LanaiTargetTransformInfo.h --- a/llvm/lib/Target/Lanai/LanaiTargetTransformInfo.h +++ b/llvm/lib/Target/Lanai/LanaiTargetTransformInfo.h @@ -52,6 +52,16 @@ InstructionCost getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) { assert(Ty->isIntegerTy()); + unsigned BitSize = Ty->getPrimitiveSizeInBits(); + // There is no cost model for constants with a bit size of 0. Return + // TCC_Free here, so that constant hoisting will ignore this constant. + if (BitSize == 0) + return TTI::TCC_Free; + // No cost model for operations on integers larger than 64 bit implemented + // yet. + if (BitSize > 64) + return TTI::TCC_Free; + if (Imm == 0) return TTI::TCC_Free; if (isInt<16>(Imm.getSExtValue())) diff --git a/llvm/test/CodeGen/Lanai/lowering-128.ll b/llvm/test/CodeGen/Lanai/lowering-128.ll --- a/llvm/test/CodeGen/Lanai/lowering-128.ll +++ b/llvm/test/CodeGen/Lanai/lowering-128.ll @@ -11,3 +11,12 @@ %a = add i128 %x, %y ret i128 %a } + +; CHECK-LABEL: immshift128: +define i128 @immshift128(i1 %sel) unnamed_addr { + %a = add i128 0, 340282366920938463463374007431768209319 + %b = add i128 0, 340282366920938463463374607431768209320 + %c = select i1 %sel, i128 %a, i128 %b + %d = shl i128 %a, 10 + ret i128 %d +}