[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