umesh.kalappa0 created this revision. umesh.kalappa0 added a reviewer: nikic. umesh.kalappa0 added a project: LLVM. Herald added subscribers: StephenFan, hiraditya. Herald added a project: All. umesh.kalappa0 requested review of this revision. Herald added a project: clang. Herald added subscribers: llvm-commits, cfe-commits.
Fix for the issue :https://github.com/llvm/llvm-project/issues/59580 Where we don't emit the inbounds flag for the GEP when wrapv is enbled . Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142872 Files: clang/include/clang/Basic/CodeGenOptions.def clang/lib/CodeGen/CGExpr.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/test/CodeGen/inbounds.c llvm/include/llvm/IR/ConstantFold.h llvm/lib/IR/ConstantFold.cpp llvm/lib/IR/Constants.cpp
Index: llvm/lib/IR/Constants.cpp =================================================================== --- llvm/lib/IR/Constants.cpp +++ llvm/lib/IR/Constants.cpp @@ -2510,7 +2510,9 @@ ArgVec.push_back(Idx); } - unsigned SubClassOptionalData = InBounds ? GEPOperator::IsInBounds : 0; + unsigned SubClassOptionalData = ( InBounds && !llvm::getSignedWrap() ) ? + GEPOperator::IsInBounds : 0; + if (InRangeIndex && *InRangeIndex < 63) SubClassOptionalData |= (*InRangeIndex + 1) << 1; const ConstantExprKeyType Key(Instruction::GetElementPtr, ArgVec, 0, Index: llvm/lib/IR/ConstantFold.cpp =================================================================== --- llvm/lib/IR/ConstantFold.cpp +++ llvm/lib/IR/ConstantFold.cpp @@ -347,6 +347,14 @@ } } +bool llvm::getSignedWrap() { + return llvm::SignedWrap; +} + +void llvm::setSignedWrap(bool SignedWrap) { + llvm::SignedWrap=SignedWrap; +} + Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V, Type *DestTy) { if (isa<PoisonValue>(V)) Index: llvm/include/llvm/IR/ConstantFold.h =================================================================== --- llvm/include/llvm/IR/ConstantFold.h +++ llvm/include/llvm/IR/ConstantFold.h @@ -26,10 +26,15 @@ namespace llvm { template <typename T> class ArrayRef; + inline bool SignedWrap = false; + class Value; class Constant; class Type; + bool getSignedWrap(void); + void setSignedWrap(bool Wrap); + // Constant fold various types of instruction... Constant *ConstantFoldCastInstruction( unsigned opcode, ///< The opcode of the cast Index: clang/test/CodeGen/inbounds.c =================================================================== --- /dev/null +++ clang/test/CodeGen/inbounds.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fwrapv -emit-llvm -o - %s | FileCheck %s + +extern char base[]; + +char *test() { + return base + 1; +} + +// CHECK: ret ptr getelementptr (i8, ptr @base, i64 1) Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1689,6 +1689,9 @@ llvm::is_contained(DebugEntryValueArchs, T.getArch())) Opts.EmitCallSiteInfo = true; + if (Args.hasArg(OPT_fwrapv)) + Opts.SignedWrap = true; + if (!Opts.EnableDIPreservationVerify && Opts.DIBugsReportFilePath.size()) { Diags.Report(diag::warn_ignoring_verify_debuginfo_preserve_export) << Opts.DIBugsReportFilePath; Index: clang/lib/CodeGen/CGExpr.cpp =================================================================== --- clang/lib/CodeGen/CGExpr.cpp +++ clang/lib/CodeGen/CGExpr.cpp @@ -3613,7 +3613,12 @@ if (!E->getType()->isVariableArrayType()) { assert(isa<llvm::ArrayType>(Addr.getElementType()) && "Expected pointer to array"); + + if (CGM.getCodeGenOpts().SignedWrap) + llvm::setSignedWrap(true); + Addr = Builder.CreateConstArrayGEP(Addr, 0, "arraydecay"); + } // The result of this decay conversion points to an array element within the Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -27,6 +27,7 @@ CODEGENOPT(Name, Bits, Default) #endif +CODEGENOPT(SignedWrap , 1, 0) ///< -fwarpv CODEGENOPT(DisableIntegratedAS, 1, 0) ///< -no-integrated-as ENUM_CODEGENOPT(CompressDebugSections, llvm::DebugCompressionType, 2, llvm::DebugCompressionType::None)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits