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

hfinkel at anl.gov hfinkel at anl.gov
Thu Apr 30 08:24:52 PDT 2015


Hi chandlerc, reames, atrick,

This is part of the series started by D9375, and teaches ScalarEvolution to look through the intrinsic. This    is necessary, for example, so that loop vectorization can proceed even with llvm.noalias intrinsics inside the loop.

While, in theory, this could lead to rewriting which removes the intrinsics, I think this is unlikely in practice except very late in the pipeline (by LoopVectorize, LSR, etc.), and we can deal with these passes specifically if that turns out to be a problem.

http://reviews.llvm.org/D9381

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

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"
@@ -4433,11 +4435,20 @@
             return getAddExpr(getUMaxExpr(One, LS), LDiff);
         }
         break;
+
       default:
         break;
       }
     }
 
+  case Instruction::Call:
+    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
+      if (II->getIntrinsicID() == Intrinsic::noalias)
+        return getSCEV(U->getOperand(0));
+    }
+
+    break;
+
   default: // We cannot analyze this expression.
     break;
   }
Index: test/Analysis/ScalarEvolution/noalias.ll
===================================================================
--- /dev/null
+++ test/Analysis/ScalarEvolution/noalias.ll
@@ -0,0 +1,19 @@
+; 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
+
+!0 = !{!0, !"some domain"}
+!1 = !{!1, !0, !"some scope"}
+

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9381.24715.patch
Type: text/x-patch
Size: 1739 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150430/b399f059/attachment.bin>


More information about the llvm-commits mailing list