diff options
author | Nikita Popov <npopov@redhat.com> | 2025-09-30 16:16:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-30 16:16:42 +0200 |
commit | 4a873d58df755d220889b994f59cbdea2cdefc49 (patch) | |
tree | 91032efb7948f8b90eb0d585fa34cfbf9a16e189 /llvm/lib/IR/Value.cpp | |
parent | cf50bbf983c6ff032c7ad0de27ffaff412947ffb (diff) | |
download | llvm-4a873d58df755d220889b994f59cbdea2cdefc49.zip llvm-4a873d58df755d220889b994f59cbdea2cdefc49.tar.gz llvm-4a873d58df755d220889b994f59cbdea2cdefc49.tar.bz2 |
[IR] Don't create ptrtoint expression to determine alignment (NFCI) (#161364)
We try to determine the alignment of a constant by creating a ptrtoint
expression and seeing if it folds. I believe the only case this can
actually handle is where the constant is an inttoptr expression. Handle
that directly instead of going through another ptrtoint expression.
I ran into this while trying to clean up our isEliminableCastPair()
mess, which is going to disable ptrtoint(inttoptr) folding without
DataLayout, breaking this code.
Diffstat (limited to 'llvm/lib/IR/Value.cpp')
-rw-r--r-- | llvm/lib/IR/Value.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 4e8f359..e5e062d 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -1000,14 +1000,12 @@ Align Value::getPointerAlignment(const DataLayout &DL) const { ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0)); return Align(CI->getLimitedValue()); } - } else if (auto *CstPtr = dyn_cast<Constant>(this)) { - // Strip pointer casts to avoid creating unnecessary ptrtoint expression - // if the only "reduction" is combining a bitcast + ptrtoint. - CstPtr = CstPtr->stripPointerCasts(); - if (auto *CstInt = dyn_cast_or_null<ConstantInt>(ConstantExpr::getPtrToInt( - const_cast<Constant *>(CstPtr), DL.getIntPtrType(getType()), - /*OnlyIfReduced=*/true))) { - size_t TrailingZeros = CstInt->getValue().countr_zero(); + } else if (auto *CE = dyn_cast<ConstantExpr>(this)) { + // Determine the alignment of inttoptr(C). + if (CE->getOpcode() == Instruction::IntToPtr && + isa<ConstantInt>(CE->getOperand(0))) { + ConstantInt *IntPtr = cast<ConstantInt>(CE->getOperand(0)); + size_t TrailingZeros = IntPtr->getValue().countr_zero(); // While the actual alignment may be large, elsewhere we have // an arbitrary upper alignmet limit, so let's clamp to it. return Align(TrailingZeros < Value::MaxAlignmentExponent |