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
This commit is contained in:
Eli Friedman 2017-06-14 22:43:28 +00:00
parent 5aa56d2d6e
commit 127e0cd21b
2 changed files with 41 additions and 4 deletions

View File

@ -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);
}

View File

@ -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()