[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