aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/Loads.cpp
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2025-09-02 10:51:31 +0100
committerFlorian Hahn <flo@fhahn.com>2025-09-02 10:51:32 +0100
commitcf444ac2adc45c1079856087b8ba9a04466f78db (patch)
tree1df73e5151818039fbe9a6919c4aac2eff808d59 /llvm/lib/Analysis/Loads.cpp
parenta6bd36eb71cf8ad281311f6ea1428a04e8783382 (diff)
downloadllvm-cf444ac2adc45c1079856087b8ba9a04466f78db.zip
llvm-cf444ac2adc45c1079856087b8ba9a04466f78db.tar.gz
llvm-cf444ac2adc45c1079856087b8ba9a04466f78db.tar.bz2
[Loads] Check for overflow when adding MaxPtrDiff + Offset.
MaxPtrDiff + Offset may wrap, leading to incorrect results. Use uadd_ov to check for overflow.
Diffstat (limited to 'llvm/lib/Analysis/Loads.cpp')
-rw-r--r--llvm/lib/Analysis/Loads.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp
index 7a8fbbd..58f559a 100644
--- a/llvm/lib/Analysis/Loads.cpp
+++ b/llvm/lib/Analysis/Loads.cpp
@@ -386,7 +386,10 @@ bool llvm::isDereferenceableAndAlignedInLoop(
if (Offset->getAPInt().urem(Alignment.value()) != 0)
return false;
- AccessSize = MaxPtrDiff + Offset->getAPInt();
+ bool Overflow = false;
+ AccessSize = MaxPtrDiff.uadd_ov(Offset->getAPInt(), Overflow);
+ if (Overflow)
+ return false;
AccessSizeSCEV = SE.getAddExpr(PtrDiff, Offset);
Base = NewBase->getValue();
} else