[PATCH] D142872: Honor the fwrapv option when generating the inbounds GEP .

Umesh Kalappa via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 31 08:05:43 PST 2023


umesh.kalappa0 updated this revision to Diff 493623.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142872/new/

https://reviews.llvm.org/D142872

Files:
  clang/lib/CodeGen/CGExpr.cpp
  clang/test/CodeGen/inbounds.c
  llvm/include/llvm/IR/ConstantFold.h
  llvm/lib/IR/ConstantFold.cpp


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 sWrap) {
+  llvm::SignedWrap=sWrap;
+}
+
 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/CodeGen/CGExpr.cpp
===================================================================
--- clang/lib/CodeGen/CGExpr.cpp
+++ clang/lib/CodeGen/CGExpr.cpp
@@ -3613,7 +3613,15 @@
   if (!E->getType()->isVariableArrayType()) {
     assert(isa<llvm::ArrayType>(Addr.getElementType()) &&
            "Expected pointer to array");
-    Addr = Builder.CreateConstArrayGEP(Addr, 0, "arraydecay");
+
+    if (getLangOpts().isSignedOverflowDefined()) {
+      llvm::setSignedWrap(true);
+      Addr = Builder.CreateConstGEP(Addr, 0, "arraydecay");
+    }
+    else {
+      Addr = Builder.CreateConstArrayGEP(Addr, 0, "arraydecay");
+    }
+
   }
 
   // The result of this decay conversion points to an array element within the


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142872.493623.patch
Type: text/x-patch
Size: 2197 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230131/b7b37d01/attachment.bin>


More information about the llvm-commits mailing list