diff options
| author | Hari Limaye <hari.limaye@arm.com> | 2024-08-27 14:20:48 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-27 14:20:48 +0100 |
| commit | 3d2fd31c8f362b1054985197a65194fcbbca57bb (patch) | |
| tree | a74d1481ec8b56c2a3f08ce56c0d363f7f2967b5 /clang/lib/CodeGen/CGExprScalar.cpp | |
| parent | ed1c1da04804ac7e355426922f6e1579a90e4ff1 (diff) | |
[clang] Add nuw attribute to GEPs (#105496)
Add nuw attribute to inbounds GEPs where the expression used to form the
GEP is an addition of unsigned indices.
Diffstat (limited to 'clang/lib/CodeGen/CGExprScalar.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index af11bc20a3b6..5b55ec9d8064 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -36,6 +36,7 @@ #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/FixedPointBuilder.h" #include "llvm/IR/Function.h" +#include "llvm/IR/GEPNoWrapFlags.h" #include "llvm/IR/GetElementPtrTypeIterator.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/Intrinsics.h" @@ -5756,7 +5757,12 @@ CodeGenFunction::EmitCheckedInBoundsGEP(llvm::Type *ElemTy, Value *Ptr, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, const Twine &Name) { llvm::Type *PtrTy = Ptr->getType(); - Value *GEPVal = Builder.CreateInBoundsGEP(ElemTy, Ptr, IdxList, Name); + + llvm::GEPNoWrapFlags NWFlags = llvm::GEPNoWrapFlags::inBounds(); + if (!SignedIndices && !IsSubtraction) + NWFlags |= llvm::GEPNoWrapFlags::noUnsignedWrap(); + + Value *GEPVal = Builder.CreateGEP(ElemTy, Ptr, IdxList, Name, NWFlags); // If the pointer overflow sanitizer isn't enabled, do nothing. if (!SanOpts.has(SanitizerKind::PointerOverflow)) @@ -5871,8 +5877,13 @@ Address CodeGenFunction::EmitCheckedInBoundsGEP( Address Addr, ArrayRef<Value *> IdxList, llvm::Type *elementType, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, CharUnits Align, const Twine &Name) { - if (!SanOpts.has(SanitizerKind::PointerOverflow)) - return Builder.CreateInBoundsGEP(Addr, IdxList, elementType, Align, Name); + if (!SanOpts.has(SanitizerKind::PointerOverflow)) { + llvm::GEPNoWrapFlags NWFlags = llvm::GEPNoWrapFlags::inBounds(); + if (!SignedIndices && !IsSubtraction) + NWFlags |= llvm::GEPNoWrapFlags::noUnsignedWrap(); + + return Builder.CreateGEP(Addr, IdxList, elementType, Align, Name, NWFlags); + } return RawAddress( EmitCheckedInBoundsGEP(Addr.getElementType(), Addr.emitRawPointer(*this), |
