forked from OSchip/llvm-project
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:
parent
5aa56d2d6e
commit
127e0cd21b
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue