diff options
author | Nikita Popov <npopov@redhat.com> | 2025-07-23 11:36:48 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2025-07-23 12:19:50 +0200 |
commit | a7edc95c799c46665ecf4465a4dc7ff4bee3ced0 (patch) | |
tree | f861023fd6f9419b9e7af4d887123369c3872436 /llvm | |
parent | 5de443a4d37e1b7580f9ccee389572aef7233a85 (diff) | |
download | llvm-a7edc95c799c46665ecf4465a4dc7ff4bee3ced0.zip llvm-a7edc95c799c46665ecf4465a4dc7ff4bee3ced0.tar.gz llvm-a7edc95c799c46665ecf4465a4dc7ff4bee3ced0.tar.bz2 |
[IR] Optimize stripAndAccumulateConstantOffsets() for common case (NFC)
For the common case where we don't have bit width changing address
space casts, we can directly call accumulateConstantOffset() on the
original Offset. Skip the bit width reconciliation logic in that
case.
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/IR/Value.cpp | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index 5928c89..129ca4a 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -747,28 +747,34 @@ const Value *Value::stripAndAccumulateConstantOffsets( // means when we construct GEPOffset, we need to use the size // of GEP's pointer type rather than the size of the original // pointer type. - APInt GEPOffset(DL.getIndexTypeSizeInBits(V->getType()), 0); - if (!GEP->accumulateConstantOffset(DL, GEPOffset, ExternalAnalysis)) - return V; - - // Stop traversal if the pointer offset wouldn't fit in the bit-width - // provided by the Offset argument. This can happen due to AddrSpaceCast - // stripping. - if (GEPOffset.getSignificantBits() > BitWidth) - return V; - - // External Analysis can return a result higher/lower than the value - // represents. We need to detect overflow/underflow. - APInt GEPOffsetST = GEPOffset.sextOrTrunc(BitWidth); - if (!ExternalAnalysis) { - Offset += GEPOffsetST; + unsigned CurBitWidth = DL.getIndexTypeSizeInBits(V->getType()); + if (CurBitWidth == BitWidth) { + if (!GEP->accumulateConstantOffset(DL, Offset, ExternalAnalysis)) + return V; } else { - bool Overflow = false; - APInt OldOffset = Offset; - Offset = Offset.sadd_ov(GEPOffsetST, Overflow); - if (Overflow) { - Offset = OldOffset; + APInt GEPOffset(CurBitWidth, 0); + if (!GEP->accumulateConstantOffset(DL, GEPOffset, ExternalAnalysis)) + return V; + + // Stop traversal if the pointer offset wouldn't fit in the bit-width + // provided by the Offset argument. This can happen due to AddrSpaceCast + // stripping. + if (GEPOffset.getSignificantBits() > BitWidth) return V; + + // External Analysis can return a result higher/lower than the value + // represents. We need to detect overflow/underflow. + APInt GEPOffsetST = GEPOffset.sextOrTrunc(BitWidth); + if (!ExternalAnalysis) { + Offset += GEPOffsetST; + } else { + bool Overflow = false; + APInt OldOffset = Offset; + Offset = Offset.sadd_ov(GEPOffsetST, Overflow); + if (Overflow) { + Offset = OldOffset; + return V; + } } } V = GEP->getPointerOperand(); |