[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