[PATCH] D34285: [SROA] Be smarter when copying metadata to retyped loads

Ariel Ben-Yehuda via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 26 03:40:55 PDT 2017


arielb1 updated this revision to Diff 103918.
arielb1 added a comment.

More conservative version on top of r306267.


https://reviews.llvm.org/D34285

Files:
  lib/Transforms/Scalar/SROA.cpp
  test/Transforms/SROA/pr32902.ll


Index: test/Transforms/SROA/pr32902.ll
===================================================================
--- /dev/null
+++ test/Transforms/SROA/pr32902.ll
@@ -0,0 +1,30 @@
+; RUN: opt < %s -sroa -S | FileCheck %s
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux"
+
+
+
+%foo = type { %bar* }
+%bar = type { [4 x i8] }
+
+declare void @foo(i64* noalias nocapture)
+
+; Make sure we properly handle the !nonnull attribute when we
+; convert a pointer load to an integer load.
+; CHECK-LABEL: @_ZN4core3fmt9Formatter12pad_integral17h1dcf0f409406b6e5E()
+; CHECK-NEXT: start:
+; CHECK-NEXT: %0 = inttoptr i64 0 to %bar*
+; CHECK-NEXT: ret %bar* %0
+define %bar* @_ZN4core3fmt9Formatter12pad_integral17h1dcf0f409406b6e5E()  {
+start:
+  %arg4.i = alloca %foo, align 8
+
+  %0 = bitcast %foo* %arg4.i to i64*
+  store i64 0, i64* %0, align 8
+
+  %1 = getelementptr inbounds %foo, %foo* %arg4.i, i64 0, i32 0
+  %2 = load %bar*, %bar** %1, align 8, !nonnull !0
+  ret %bar* %2
+}
+
+!0 = !{}
Index: lib/Transforms/Scalar/SROA.cpp
===================================================================
--- lib/Transforms/Scalar/SROA.cpp
+++ lib/Transforms/Scalar/SROA.cpp
@@ -2402,9 +2402,15 @@
       if (LI.isVolatile())
         NewLI->setAtomic(LI.getOrdering(), LI.getSynchScope());
 
-      // Try to preserve nonnull metadata
-      if (TargetTy->isPointerTy())
-        NewLI->copyMetadata(LI, LLVMContext::MD_nonnull);
+      // Any !nonnull metadata on the old load is also valid on the new load,
+      // so we can add it to the new load. This is valid even if there is a
+      // `zext` (which does not make much sense, but can occur if someone
+      // is treating pointers as integers) - if the loaded value is a 0,
+      // the extended value will also be `null`.
+      if (MDNode *N = LI.getMetadata(LLVMContext::MD_nonnull)) {
+	  copyNonnullMetadata(LI, N, *NewLI);
+      }
+
       V = NewLI;
 
       // If this is an integer load past the end of the slice (which means the
@@ -3587,7 +3593,7 @@
                          PartPtrTy, BasePtr->getName() + "."),
           getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false,
           LI->getName());
-      PLoad->copyMetadata(*LI, LLVMContext::MD_mem_parallel_loop_access); 
+      PLoad->copyMetadata(*LI, LLVMContext::MD_mem_parallel_loop_access);
 
       // Append this load onto the list of split loads so we can find it later
       // to rewrite the stores.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34285.103918.patch
Type: text/x-patch
Size: 2492 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170626/b139bd1a/attachment.bin>


More information about the llvm-commits mailing list