[PATCH] D9381: llvm.noalias - SCEV can look through it

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 8 16:04:54 PDT 2016


hfinkel updated this revision to Diff 63349.
hfinkel added a comment.
Herald added subscribers: mzolotukhin, mcrosier.

Rebased (and removed an unintentional whitespace change).


http://reviews.llvm.org/D9381

Files:
  lib/Analysis/ScalarEvolution.cpp
  test/Analysis/ScalarEvolution/noalias.ll

Index: test/Analysis/ScalarEvolution/noalias.ll
===================================================================
--- /dev/null
+++ test/Analysis/ScalarEvolution/noalias.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -S -analyze -scalar-evolution | FileCheck %s
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+
+define i8* @foo(i32 %no, i8* nocapture %d) nounwind {
+entry:
+  %v = call i8* @llvm.noalias.p0i8(i8* %d, metadata !1)
+  %w = getelementptr i8, i8* %v, i64 5
+  ret i8* %w
+}
+
+; CHECK-LABEL: Classifying expressions for: @foo
+; CHECK: %w = getelementptr i8, i8* %v, i64 5
+; CHECK-NEXT: (5 + %d)
+
+declare i8* @llvm.noalias.p0i8(i8*, metadata) nounwind argmemonly
+
+!0 = !{!0, !"some domain"}
+!1 = !{!1, !0, !"some scope"}
Index: lib/Analysis/ScalarEvolution.cpp
===================================================================
--- lib/Analysis/ScalarEvolution.cpp
+++ lib/Analysis/ScalarEvolution.cpp
@@ -80,6 +80,8 @@
 #include "llvm/IR/GlobalVariable.h"
 #include "llvm/IR/InstIterator.h"
 #include "llvm/IR/Instructions.h"
+#include "llvm/IR/IntrinsicInst.h"
+#include "llvm/IR/Intrinsics.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Operator.h"
@@ -5225,6 +5227,15 @@
     if (isa<Instruction>(U))
       return createNodeForSelectOrPHI(cast<Instruction>(U), U->getOperand(0),
                                       U->getOperand(1), U->getOperand(2));
+    break;
+
+  case Instruction::Call:
+    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
+      if (II->getIntrinsicID() == Intrinsic::noalias)
+        return getSCEV(U->getOperand(0));
+    }
+
+    break;
   }
 
   return getUnknown(V);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9381.63349.patch
Type: text/x-patch
Size: 1769 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160708/6e5348c0/attachment.bin>


More information about the llvm-commits mailing list