[polly] r314624 - [GPGPU] Set Polly's RTC to false in case invariant load hoisting fails

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 1 05:39:14 PDT 2017


Author: grosser
Date: Sun Oct  1 05:39:14 2017
New Revision: 314624

URL: http://llvm.org/viewvc/llvm-project?rev=314624&view=rev
Log:
[GPGPU] Set Polly's RTC to false in case invariant load hoisting fails

This matches the behavior we already have in lib/Codegen/CodeGeneration.cpp and
makes sure that we fall back to the original code. It seems when invariant load
hoisting was introduced to the GPGPU backend we missed to reset the RTC flag,
such that kernels where invariant load hoisting failed executed the 'optimized'
SCoP, which however is set to a simple 'unreachable'. Unsurprisingly, this
results in hard to debug issues that are a lot of fun to debug.

Added:
    polly/trunk/test/GPGPU/failing-invariant-load-hoisting.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=314624&r1=314623&r2=314624&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp Sun Oct  1 05:39:14 2017
@@ -3478,6 +3478,12 @@ public:
     // preload invariant loads. Note: This should happen before the RTC
     // because the RTC may depend on values that are invariant load hoisted.
     if (!NodeBuilder.preloadInvariantLoads()) {
+      // Patch the introduced branch condition to ensure that we always execute
+      // the original SCoP.
+      auto *FalseI1 = Builder.getFalse();
+      auto *SplitBBTerm = Builder.GetInsertBlock()->getTerminator();
+      SplitBBTerm->setOperand(0, FalseI1);
+
       DEBUG(dbgs() << "preloading invariant loads failed in function: " +
                           S->getFunction().getName() +
                           " | Scop Region: " + S->getNameStr());

Added: polly/trunk/test/GPGPU/failing-invariant-load-hoisting.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/GPGPU/failing-invariant-load-hoisting.ll?rev=314624&view=auto
==============================================================================
--- polly/trunk/test/GPGPU/failing-invariant-load-hoisting.ll (added)
+++ polly/trunk/test/GPGPU/failing-invariant-load-hoisting.ll Sun Oct  1 05:39:14 2017
@@ -0,0 +1,40 @@
+; RUN: opt %loadPolly -S < %s -polly-codegen-ppcg \
+; RUN: -polly-invariant-load-hoisting | FileCheck %s -check-prefix=CODEGEN
+
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n8:16:32-S64"
+
+%S = type { i32, i32, [12 x %L] }
+%L = type { i32, i32, double, i32, i32, i32, i32, i32 }
+
+define void @test(%S* %cpi, i1 %b) {
+; CODEGEN-LABEL: @test(
+; CODEGEN:    polly.preload.begin:
+; CODEGEN-NEXT:  br i1 false
+
+entry:
+  %nt = getelementptr inbounds %S, %S* %cpi, i32 0, i32 1
+  br i1 %b, label %if.then14, label %exit
+
+if.then14:
+  %ns = getelementptr inbounds %S, %S* %cpi, i32 0, i32 0
+  %l0 = load i32, i32* %ns, align 8
+  %cmp12.i = icmp sgt i32 %l0, 0
+  br i1 %cmp12.i, label %for.body.lr.ph.i, label %exit
+
+for.body.lr.ph.i:
+  %l1 = load i32, i32* %nt, align 4
+  br label %for.body.i
+
+for.body.i:
+  %phi = phi i32 [ 0, %for.body.lr.ph.i ], [ %inc, %for.body.i ]
+  %mul.i163 = mul nsw i32 %phi, %l1
+  %cv = getelementptr inbounds %S, %S* %cpi, i32 0, i32 2, i32 %mul.i163, i32 0
+  store i32 0, i32* %cv, align 8
+  %inc = add nuw nsw i32 %phi, 1
+  %l2 = load i32, i32* %ns, align 8
+  %cmp.i164 = icmp slt i32 %inc, %l2
+  br i1 %cmp.i164, label %for.body.i, label %exit
+
+exit:
+  ret void
+}




More information about the llvm-commits mailing list