From 127e0cd21b6e89fe9f052d39aaeea35c64e9b3da Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Wed, 14 Jun 2017 22:43:28 +0000 Subject: [PATCH] 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 --- polly/lib/Support/SCEVValidator.cpp | 9 ++--- ...stant_functions_outside_scop_as_unknown.ll | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll diff --git a/polly/lib/Support/SCEVValidator.cpp b/polly/lib/Support/SCEVValidator.cpp index 1941875d0d52..3662424250c2 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(I); - - if (!isConstCall(Call)) - return ValidatorResult(SCEVType::INVALID, S); + if (R->contains(I)) { + auto Call = cast(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 000000000000..6892c0e393b3 --- /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}<%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()