aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Value.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2025-09-30 16:16:42 +0200
committerGitHub <noreply@github.com>2025-09-30 16:16:42 +0200
commit4a873d58df755d220889b994f59cbdea2cdefc49 (patch)
tree91032efb7948f8b90eb0d585fa34cfbf9a16e189 /llvm/lib/IR/Value.cpp
parentcf50bbf983c6ff032c7ad0de27ffaff412947ffb (diff)
downloadllvm-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.cpp14
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