diff options
author | Andreas Jonson <andjo403@hotmail.com> | 2024-06-14 10:04:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-14 10:04:33 +0200 |
commit | ae71609e91ec9f38df7e92ba3c50a1f9cebb772e (patch) | |
tree | 6a2ad37d583bfd3cf255781d61b0a6d374e5934a /llvm/lib/CodeGen | |
parent | 706e1975400b3f30bd406b694bb711a7c7dbe1c4 (diff) | |
download | llvm-ae71609e91ec9f38df7e92ba3c50a1f9cebb772e.zip llvm-ae71609e91ec9f38df7e92ba3c50a1f9cebb772e.tar.gz llvm-ae71609e91ec9f38df7e92ba3c50a1f9cebb772e.tar.bz2 |
[SDAG] Lower range attribute to AssertZext (#95450)
Add support for range attributes on calls, in addition to range metadata.
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 2b82d87..98555b3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4487,6 +4487,17 @@ static const MDNode *getRangeMetadata(const Instruction &I) { return I.getMetadata(LLVMContext::MD_range); } +static std::optional<ConstantRange> getRange(const Instruction &I) { + if (const auto *CB = dyn_cast<CallBase>(&I)) { + // see comment in getRangeMetadata about this check + if (CB->hasRetAttr(Attribute::NoUndef)) + return CB->getRange(); + } + if (const MDNode *Range = getRangeMetadata(I)) + return getConstantRangeFromMetadata(*Range); + return std::nullopt; +} + void SelectionDAGBuilder::visitLoad(const LoadInst &I) { if (I.isAtomic()) return visitAtomicLoad(I); @@ -10230,19 +10241,16 @@ void SelectionDAGBuilder::visitVACopy(const CallInst &I) { SDValue SelectionDAGBuilder::lowerRangeToAssertZExt(SelectionDAG &DAG, const Instruction &I, SDValue Op) { - const MDNode *Range = getRangeMetadata(I); - if (!Range) - return Op; + std::optional<ConstantRange> CR = getRange(I); - ConstantRange CR = getConstantRangeFromMetadata(*Range); - if (CR.isFullSet() || CR.isEmptySet() || CR.isUpperWrapped()) + if (!CR || CR->isFullSet() || CR->isEmptySet() || CR->isUpperWrapped()) return Op; - APInt Lo = CR.getUnsignedMin(); + APInt Lo = CR->getUnsignedMin(); if (!Lo.isMinValue()) return Op; - APInt Hi = CR.getUnsignedMax(); + APInt Hi = CR->getUnsignedMax(); unsigned Bits = std::max(Hi.getActiveBits(), static_cast<unsigned>(IntegerType::MIN_INT_BITS)); |