[polly] r252301 - Fix reuse of non-dominating synthesized value in subregion exit

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 6 05:51:25 PST 2015


Author: meinersbur
Date: Fri Nov  6 07:51:24 2015
New Revision: 252301

URL: http://llvm.org/viewvc/llvm-project?rev=252301&view=rev
Log:
Fix reuse of non-dominating synthesized value in subregion exit

We were adding all generated values in non-affine subregions to be used
for the subregions generated exit block. The thought was that only
values that are dominating the original exit block can be used there.
But it is possible for synthesizable values to be expanded in any
block. If the same values is also used for implicit writes, it would
try to reuse already synthesized values even if not dominating the exit
block.

The fix is to only add values to the list of values usable in the exit
block only if it is dominating the exit block. This fixes
llvm.org/PR25412.

Added:
    polly/trunk/test/Isl/CodeGen/non-affine-synthesized-in-branch.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=252301&r1=252300&r2=252301&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original)
+++ polly/trunk/lib/CodeGen/BlockGenerators.cpp Fri Nov  6 07:51:24 2015
@@ -1074,7 +1074,8 @@ void RegionGenerator::copyStmt(ScopStmt
         Blocks.push_back(*SI);
 
     // Remember value in case it is visible after this subregion.
-    ValueMap.insert(RegionMap.begin(), RegionMap.end());
+    if (DT.dominates(BB, R->getExit()))
+      ValueMap.insert(RegionMap.begin(), RegionMap.end());
   }
 
   // Now create a new dedicated region exit block and add it to the region map.

Added: polly/trunk/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll?rev=252301&view=auto
==============================================================================
--- polly/trunk/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll (added)
+++ polly/trunk/test/Isl/CodeGen/non-affine-synthesized-in-branch.ll Fri Nov  6 07:51:24 2015
@@ -0,0 +1,30 @@
+; RUN: opt -polly-process-unprofitable -polly-codegen -S < %s | FileCheck %s
+;
+; llvm.org/PR25412
+; %synthgep caused %gep to be synthesized in subregion_if which was reused for
+; %retval in subregion_exit, even though it is not dominating subregion_exit.
+;
+; CHECK-LABEL: polly.stmt.polly.merge_new_and_old.exit:
+; CHECK:         %scevgep[[R1:[0-9]*]] = getelementptr %struct.hoge, %struct.hoge* %arg, i64 0, i32 2
+; CHECK:         store double* %scevgep[[R1]], double** %gep.s2a
+; CHECK:         br label
+
+%struct.hoge = type { double, double, double }
+
+define double @func(%struct.hoge* %arg) {
+entry:
+  br label %subregion_entry
+
+subregion_entry:
+  %gep = getelementptr inbounds %struct.hoge, %struct.hoge* %arg, i64 0, i32 2
+  %cond = fcmp ogt double undef, undef
+  br i1 %cond, label %subregion_if, label %subregion_exit
+
+subregion_if:
+  %synthgep = load double, double* %gep
+  br label %subregion_exit
+
+subregion_exit:
+  %retval = load double, double* %gep
+  ret double %retval
+}




More information about the llvm-commits mailing list