summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <efriedma@codeaurora.org>2017-06-14 22:43:28 +0000
committerEli Friedman <efriedma@codeaurora.org>2017-06-14 22:43:28 +0000
commit127e0cd21b6e89fe9f052d39aaeea35c64e9b3da (patch)
tree92b1532beda652199f4368a226bda8e068ec90b5
parent5aa56d2d6e6e1eb7f7b2ceb96d2c7146b31b581b (diff)
downloadbcm5719-llvm-127e0cd21b6e89fe9f052d39aaeea35c64e9b3da.tar.gz
bcm5719-llvm-127e0cd21b6e89fe9f052d39aaeea35c64e9b3da.zip
Don't check side effects for functions outside of SCoP
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 treats the results as a parameter (SCEVType::PARAM) to the SCoP instead of returning SCEVType::INVALID. Patch by Sameer Abu Asal. llvm-svn: 305423
-rw-r--r--polly/lib/Support/SCEVValidator.cpp9
-rw-r--r--polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll36
2 files changed, 41 insertions, 4 deletions
diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp
index 1941875d0d5..3662424250c 100644
--- a/polly/lib/Support/SCEVValidator.cpp
+++ b/polly/lib/Support/SCEVValidator.cpp
@@ -320,11 +320,12 @@ public:
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);
}
diff --git a/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll b/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll
new file mode 100644
index 00000000000..6892c0e393b
--- /dev/null
+++ b/polly/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()
OpenPOWER on IntegriCloud