[PATCH] D34188: Don't check side effects for functions outside of SCoP
Sameer AbuAsal via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 13 17:46:02 PDT 2017
sabuasal created this revision.
sabuasal added a project: Polly.
In r304074 we introduce a patch to accept results from side effect free
functions into SCEV modeling. This causes rejection of cases where the
call is happening outside the SCoP. This patch checks if the call is
outside the Region and treatts the results as a parameter (SCEVType::PARAM)
to the SCoP instead of returning SCEVType::INVALID.
Repository:
rL LLVM
https://reviews.llvm.org/D34188
Files:
lib/Support/SCEVValidator.cpp
test/ScopInfo/constant_functions_outside_scop_as_unknown.ll
Index: test/ScopInfo/constant_functions_outside_scop_as_unknown.ll
===================================================================
--- /dev/null
+++ test/ScopInfo/constant_functions_outside_scop_as_unknown.ll
@@ -0,0 +1,36 @@
+; RUN: opt -polly-process-unprofitable -polly-scops -analyze < %s | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+
+; CHECK: Region: %for.cond62---%for.cond
+; CHECK: p0: {0,+,1}<nuw><%for.cond>
+; CHECK-NEXT: p1: %param1
+; CHECK-NEXT: p2: %param2
+; CHECK-NEXT: Arrays {
+
+define void @f(i8* %param1) {
+entry:
+ br label %for.cond
+
+for.cond:
+ %hook = phi i8* [ %param1, %entry ], [ %add.ptr201, %cleanup ]
+ br i1 undef, label %for.body, label %for.cond.cleanup
+
+for.body:
+ %param2 = call i32 @g()
+ %add.ptr60 = getelementptr inbounds i8, i8* %hook, i32 %param2
+ br label %for.cond62
+
+for.cond62:
+ %cmp64 = icmp ule i8* %add.ptr60, null
+ br i1 %cmp64, label %for.cond62, label %cleanup
+
+cleanup:
+ %add.ptr201 = getelementptr inbounds i8, i8* %hook, i32 1
+ br label %for.cond
+
+for.cond.cleanup:
+ ret void
+}
+
+declare i32 @g()
Index: lib/Support/SCEVValidator.cpp
===================================================================
--- lib/Support/SCEVValidator.cpp
+++ lib/Support/SCEVValidator.cpp
@@ -320,11 +320,12 @@
ValidatorResult visitCallInstruction(Instruction *I, const SCEV *S) {
assert(I->getOpcode() == Instruction::Call && "Call instruction expected");
- auto Call = cast<CallInst>(I);
-
- if (!isConstCall(Call))
- return ValidatorResult(SCEVType::INVALID, S);
+ if (R->contains(I)) {
+ auto Call = cast<CallInst>(I);
+ if (!isConstCall(Call))
+ return ValidatorResult(SCEVType::INVALID, S);
+ }
return ValidatorResult(SCEVType::PARAM, S);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34188.102465.patch
Type: text/x-patch
Size: 1820 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170614/519dcba9/attachment.bin>
More information about the llvm-commits
mailing list