[polly] r304398 - [BlockGenerator] Take context into account when identifying partial writes

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 1 02:34:21 PDT 2017


Author: grosser
Date: Thu Jun  1 04:34:20 2017
New Revision: 304398

URL: http://llvm.org/viewvc/llvm-project?rev=304398&view=rev
Log:
[BlockGenerator] Take context into account when identifying partial writes

A partial write is a write where the domain of the values written is a subset of
the execution domain of the parent statement containing the write. Originally,
we directly checked this subset relation whereas it is indeed only important
that the subset relation holds for the parameter values that are known to be
valid in the execution context of the scop. We update our check to avoid the
unnecessary introduction of partial writes in situations where the write appears
to be partial without context information, but where context information allows
us to understand that a full write can be generated.

This change fixes (hides) a recent regression introduced in r303517, which broke
our AOSP builds. The part that is correctly fixed in this change is that we do
not any more unnecessarily generate a partial write. This is good performance
wise and, as we currently do not yet explicitly introduce partial writes in the
default configuration, this also hides possible bugs in the partial writes
implementation. The crashes that we have originally seen were caused by such
a bug, where partial writes were incorrectly generated in region statements. An
additional patch in a subsequent commit is needed to address this problem.

Reported-by: Reported-by: Eli Friedman <efriedma at codeaurora.org>

Differential Revision: https://reviews.llvm.org/D33759

Added:
    polly/trunk/test/Isl/CodeGen/partial_write_full_write_that_appears_partial.ll
Modified:
    polly/trunk/lib/CodeGen/BlockGenerators.cpp

Modified: polly/trunk/lib/CodeGen/BlockGenerators.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/BlockGenerators.cpp?rev=304398&r1=304397&r2=304398&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original)
+++ polly/trunk/lib/CodeGen/BlockGenerators.cpp Thu Jun  1 04:34:20 2017
@@ -595,7 +595,10 @@ void BlockGenerator::generateConditional
 
   // If the condition is a tautology, don't generate a condition around the
   // code.
-  if (StmtDom.is_subset(Subdomain)) {
+  bool IsPartialWrite =
+      !StmtDom.intersect_params(give(Stmt.getParent()->getContext()))
+           .is_subset(Subdomain);
+  if (!IsPartialWrite) {
     GenThenFunc();
     return;
   }

Added: polly/trunk/test/Isl/CodeGen/partial_write_full_write_that_appears_partial.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/partial_write_full_write_that_appears_partial.ll?rev=304398&view=auto
==============================================================================
--- polly/trunk/test/Isl/CodeGen/partial_write_full_write_that_appears_partial.ll (added)
+++ polly/trunk/test/Isl/CodeGen/partial_write_full_write_that_appears_partial.ll Thu Jun  1 04:34:20 2017
@@ -0,0 +1,34 @@
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+
+; CHECK:      polly.stmt.if.then81:                             ; preds = %polly.stmt.if.end75
+; CHECK-NEXT:   %scevgep = getelementptr [2 x %S], [2 x %S]* %tmp, i64 0, i64 %.147
+; CHECK-NEXT:   %scevgep1 = bitcast %S* %scevgep to float*
+; CHECK-NEXT:   store float undef, float* %scevgep1, align 4, !alias.scope !0, !noalias !2
+; CHECK-NEXT:   br label %polly.stmt.if.end87.region_exiting
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64--linux-android"
+
+%S = type { float, float }
+
+define void @f() {
+entry:
+  %tmp = alloca [2 x %S], align 4
+  %cmp52 = fcmp olt float undef, undef
+  %not.cmp52 = xor i1 %cmp52, true
+  %.147 = zext i1 %not.cmp52 to i64
+  %fX64 = getelementptr inbounds [2 x %S], [2 x %S]* %tmp, i64 0, i64 %.147, i32 0
+  br label %if.end75
+
+if.end75:
+  %cmp80 = fcmp olt float undef, undef
+  br i1 %cmp80, label %if.then81, label %if.end87
+
+if.then81:
+  store float undef, float* %fX64, align 4
+  br label %if.end87
+
+if.end87:
+  %0 = phi float [ undef, %if.then81 ], [ undef, %if.end75 ]
+  ret void
+}




More information about the llvm-commits mailing list