[polly] r314894 - [GPGPU] Make sure escaping invariant load hoisted scalars are preserved

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 4 03:24:23 PDT 2017


Author: grosser
Date: Wed Oct  4 03:24:23 2017
New Revision: 314894

URL: http://llvm.org/viewvc/llvm-project?rev=314894&view=rev
Log:
[GPGPU] Make sure escaping invariant load hoisted scalars are preserved

We make sure that the final reload of an invariant scalar memory access uses the
same stack slot into which the invariant memory access was stored originally.
Earlier, this was broken as we introduce a new stack slot aside of the preload
stack slot, which remained uninitialized and caused our escaping loads to
contain garbage. This happened due to us clearing the pre-populated values
in EscapeMap after kernel code generation. We address this issue by preserving
the original host values and restoring them after kernel code generation.
EscapeMap is not expected to be used during kernel code generation, hence we
clear it during kernel generation to make sure that any unintended uses are
noticed.

Added:
    polly/trunk/test/GPGPU/invariant-load-escaping-values.ll
Modified:
    polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp

Modified: polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp?rev=314894&r1=314893&r2=314894&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp Wed Oct  4 03:24:23 2017
@@ -1811,6 +1811,8 @@ void GPUNodeBuilder::createKernel(__isl_
   ValueMapT HostValueMap = ValueMap;
   BlockGenerator::AllocaMapTy HostScalarMap = ScalarMap;
   ScalarMap.clear();
+  BlockGenerator::EscapeUsersAllocaMapTy HostEscapeMap = EscapeMap;
+  EscapeMap.clear();
 
   // Create for all loops we depend on values that contain the current loop
   // iteration. These values are necessary to generate code for SCEVs that
@@ -1841,7 +1843,7 @@ void GPUNodeBuilder::createKernel(__isl_
 
   ValueMap = std::move(HostValueMap);
   ScalarMap = std::move(HostScalarMap);
-  EscapeMap.clear();
+  EscapeMap = std::move(HostEscapeMap);
   IDToSAI.clear();
   Annotator.resetAlternativeAliasBases();
   for (auto &BasePtr : LocalArrays)

Added: polly/trunk/test/GPGPU/invariant-load-escaping-values.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/GPGPU/invariant-load-escaping-values.ll?rev=314894&view=auto
==============================================================================
--- polly/trunk/test/GPGPU/invariant-load-escaping-values.ll (added)
+++ polly/trunk/test/GPGPU/invariant-load-escaping-values.ll Wed Oct  4 03:24:23 2017
@@ -0,0 +1,30 @@
+; RUN: opt %loadPolly -S -polly-codegen-ppcg \
+; RUN: -polly-invariant-load-hoisting < %s | FileCheck %s
+
+; REQUIRES: pollyacc
+
+; CHECK: store i64 %polly.access.B.load, i64* %invariant.preload.s2a
+; CHECK: %invariant.final_reload = load i64, i64* %invariant.preload.s2a
+
+; Verify that the final reload of an invariant scalar memory access uses the
+; same stack slot that into which the invariant memory access was stored
+; originally. Earlier, this was broken as we introduce a new stack slot aside
+; of the preload stack slot, which remained uninitialized and caused our escaping
+; loads to contain garbage.
+
+define i64 @foo(float* %A, i64* %B) {
+entry:
+  br label %loop
+
+loop:
+  %indvar = phi i64 [0, %entry], [%indvar.next, %loop]
+  %indvar.next = add nsw i64 %indvar, 1
+  %idx = getelementptr float, float* %A, i64 %indvar
+  store float 42.0, float* %idx
+  %invariant = load i64, i64* %B
+  %cmp = icmp sle i64 %indvar, 1024
+  br i1 %cmp, label %loop, label %exit
+
+exit:
+  ret i64 %invariant
+}




More information about the llvm-commits mailing list