[PATCH] D68504: [PATCH 12/26] [noalias] CaptureTracking: learn about new noalias intrinsics

Jeroen Dobbelaere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 14 03:18:42 PDT 2020


jeroen.dobbelaere updated this revision to Diff 277743.
jeroen.dobbelaere added a comment.

Rebased to c06b7e2ab5167ad031745a706204abed1aefd823 <https://reviews.llvm.org/rGc06b7e2ab5167ad031745a706204abed1aefd823> (July 14, 2020)


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

https://reviews.llvm.org/D68504

Files:
  llvm/lib/Analysis/CaptureTracking.cpp
  llvm/test/Transforms/FunctionAttrs/nocapture.ll


Index: llvm/test/Transforms/FunctionAttrs/nocapture.ll
===================================================================
--- llvm/test/Transforms/FunctionAttrs/nocapture.ll
+++ llvm/test/Transforms/FunctionAttrs/nocapture.ll
@@ -106,6 +106,40 @@
 	ret i32 %val
 }
 
+; FNATTR: define i32 @nc1a(i32* %q, i32* nocapture %p, i1 %b)
+define i32 @nc1a(i32* %q, i32* %p, i1 %b) {
+e:
+        %pa = call i32* @llvm.noalias.p0i32.p0i8.p0p0i32.i32(i32* %p, i8* null, i32** null, i32 0, metadata !1)
+	br label %l
+l:
+	%x = phi i32* [ %pa, %e ]
+	%y = phi i32* [ %q, %e ]
+	%tmp = bitcast i32* %x to i32*		; <i32*> [#uses=2]
+	%tmp2 = select i1 %b, i32* %tmp, i32* %y
+	%val = load i32, i32* %tmp2		; <i32> [#uses=1]
+	store i32 0, i32* %tmp
+	store i32* %y, i32** @g
+	ret i32 %val
+}
+
+; FNATTR: define i32 @nc1b(i32* %q, i32* nocapture %p, i1 %b)
+define i32 @nc1b(i32* %q, i32* %p, i1 %b) {
+e:
+        %prov.p = call i32* @llvm.provenance.noalias.p0i32.p0i8.p0p0i32.p0p0i32.i32(i32* %p, i8* null, i32** null, i32** null, i32 0, metadata !1)
+	br label %l
+l:
+	%x = phi i32* [ %p, %e ]
+	%prov.x = phi i32* [ %prov.p, %e ]
+	%y = phi i32* [ %q, %e ]
+	%tmp = bitcast i32* %x to i32*		; <i32*> [#uses=2]
+	%tmp2 = select i1 %b, i32* %tmp, i32* %y
+        %prov.tmp2 = select i1 %b, i32* %prov.x, i32* %y
+	%val = load i32, i32* %tmp2		; <i32> [#uses=1]
+	store i32 0, i32* %tmp, ptr_provenance i32* %prov.tmp2
+	store i32* %y, i32** @g
+	ret i32 %val
+}
+
 ; FNATTR: define i32 @nc1_addrspace(i32* %q, i32 addrspace(1)* nocapture %p, i1 %b)
 define i32 @nc1_addrspace(i32* %q, i32 addrspace(1)* %p, i1 %b) {
 e:
@@ -319,3 +353,9 @@
 
 declare i8* @llvm.launder.invariant.group.p0i8(i8*)
 declare i8* @llvm.strip.invariant.group.p0i8(i8*)
+
+declare i32*  @llvm.noalias.p0i32.p0i8.p0p0i32.i32(i32*, i8*, i32**, i32, metadata ) nounwind
+declare i32*  @llvm.provenance.noalias.p0i32.p0i8.p0p0i32.p0p0i32.i32(i32*, i8*, i32**, i32**, i32, metadata ) nounwind
+
+!0 = !{!0, !"some domain"}
+!1 = !{!1, !0, !"some scope"}
Index: llvm/lib/Analysis/CaptureTracking.cpp
===================================================================
--- llvm/lib/Analysis/CaptureTracking.cpp
+++ llvm/lib/Analysis/CaptureTracking.cpp
@@ -25,6 +25,7 @@
 #include "llvm/IR/Dominators.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/IntrinsicInst.h"
+#include "llvm/IR/Intrinsics.h"
 #include "llvm/Support/CommandLine.h"
 
 using namespace llvm;
@@ -262,6 +263,15 @@
     switch (I->getOpcode()) {
     case Instruction::Call:
     case Instruction::Invoke: {
+      if (auto *II = dyn_cast<IntrinsicInst>(I))
+        if (II->getIntrinsicID() == Intrinsic::noalias ||
+            II->getIntrinsicID() == Intrinsic::provenance_noalias ||
+            II->getIntrinsicID() == Intrinsic::noalias_arg_guard ||
+            II->getIntrinsicID() == Intrinsic::noalias_copy_guard) {
+          AddUses(I);
+          break;
+        }
+
       auto *Call = cast<CallBase>(I);
       // Not captured if the callee is readonly, doesn't return a copy through
       // its return value and doesn't unwind (a readonly function can leak bits


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68504.277743.patch
Type: text/x-patch
Size: 3120 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200714/b5e2d836/attachment.bin>


More information about the llvm-commits mailing list