diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 7db2e8ee7e6f..4dc4d28724ef 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -199,17 +199,21 @@ ARMTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { PatternMatch::m_Value(ArgArg)))) { return IC.replaceInstUsesWith(II, ArgArg); } - if (!II.getMetadata(LLVMContext::MD_range)) { - Type *IntTy32 = Type::getInt32Ty(II.getContext()); - Metadata *M[] = { - ConstantAsMetadata::get(ConstantInt::get(IntTy32, 0)), - ConstantAsMetadata::get(ConstantInt::get(IntTy32, 0x10000))}; - II.setMetadata(LLVMContext::MD_range, MDNode::get(II.getContext(), M)); - II.setMetadata(LLVMContext::MD_noundef, - MDNode::get(II.getContext(), std::nullopt)); - return ⅈ + + if (II.getMetadata(LLVMContext::MD_range)) + break; + + ConstantRange Range(APInt(32, 0), APInt(32, 0x10000)); + + if (auto CurrentRange = II.getRange()) { + Range = Range.intersectWith(*CurrentRange); + if (Range == CurrentRange) + break; } - break; + + II.addRangeRetAttr(Range); + II.addRetAttr(Attribute::NoUndef); + return ⅈ } case Intrinsic::arm_mve_vadc: case Intrinsic::arm_mve_vadc_predicated: { |
