[polly] r252420 - [FIX] Use unreachable to indicate dead code and repair dominance

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 8 09:57:42 PST 2015


Author: jdoerfert
Date: Sun Nov  8 11:57:41 2015
New Revision: 252420

URL: http://llvm.org/viewvc/llvm-project?rev=252420&view=rev
Log:
[FIX] Use unreachable to indicate dead code and repair dominance

  When we bail out early we make the partially build new code path
  practically dead, though it was not unreachable. To remove dominance
  problems we now make it not only dead but also prevent the control
  flow to join with the original code path, thus allow to use original
  values after the SCoP without any PHI nodes.

This fixes bug 25447.

Added:
    polly/trunk/test/Isl/CodeGen/dominance_problem_after_early_codegen_bailout.ll
Modified:
    polly/trunk/lib/CodeGen/CodeGeneration.cpp

Modified: polly/trunk/lib/CodeGen/CodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/CodeGeneration.cpp?rev=252420&r1=252419&r2=252420&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/CodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGen/CodeGeneration.cpp Sun Nov  8 11:57:41 2015
@@ -152,7 +152,12 @@ public:
     if (!NodeBuilder.preloadInvariantLoads()) {
 
       auto *FalseI1 = Builder.getFalse();
-      Builder.GetInsertBlock()->getTerminator()->setOperand(0, FalseI1);
+      auto *SplitBBTerm = Builder.GetInsertBlock()->getTerminator();
+      SplitBBTerm->setOperand(0, FalseI1);
+      auto *StartBBTerm = StartBlock->getTerminator();
+      Builder.SetInsertPoint(StartBBTerm);
+      Builder.CreateUnreachable();
+      StartBBTerm->eraseFromParent();
       isl_ast_node_free(AstRoot);
 
     } else {

Added: polly/trunk/test/Isl/CodeGen/dominance_problem_after_early_codegen_bailout.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/dominance_problem_after_early_codegen_bailout.ll?rev=252420&view=auto
==============================================================================
--- polly/trunk/test/Isl/CodeGen/dominance_problem_after_early_codegen_bailout.ll (added)
+++ polly/trunk/test/Isl/CodeGen/dominance_problem_after_early_codegen_bailout.ll Sun Nov  8 11:57:41 2015
@@ -0,0 +1,49 @@
+; RUN: opt %loadPolly -polly-codegen -analyze < %s
+;
+; This caused dominance problems at some point as we do bail out during
+; code generation. Just verify it runs through.
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+%struct.hashheader.0.5.10.165.180.185 = type { i16, i16, i16, i16, i16, i16, i32, i32, i32, i32, i32, i32, i32, i32, i32, [5 x i8], [13 x i8], i8, i8, i8, [228 x i16], [228 x i8], [228 x i8], [228 x i8], [228 x i8], [228 x i8], [228 x i8], [128 x i8], [100 x [11 x i8]], [100 x i32], [100 x i32], i16 }
+
+ at hashheader = external global %struct.hashheader.0.5.10.165.180.185, align 4
+
+; Function Attrs: nounwind uwtable
+define void @strtoichar(i8* %in) #0 {
+entry:
+  br i1 undef, label %land.rhs, label %for.end
+
+land.rhs:                                         ; preds = %for.inc, %entry
+  %in.addr.012 = phi i8* [ undef, %for.inc ], [ %in, %entry ]
+  %0 = load i8, i8* %in.addr.012, align 1
+  br i1 undef, label %for.end, label %for.body
+
+for.body:                                         ; preds = %land.rhs
+  %idxprom = zext i8 %0 to i64
+  %arrayidx = getelementptr inbounds %struct.hashheader.0.5.10.165.180.185, %struct.hashheader.0.5.10.165.180.185* @hashheader, i64 0, i32 27, i64 %idxprom
+  %1 = load i8, i8* %arrayidx, align 1
+  %tobool = icmp eq i8 %1, 0
+  br i1 %tobool, label %if.else, label %land.rhs.7
+
+land.rhs.7:                                       ; preds = %for.body
+  tail call void @stringcharlen()
+  br i1 undef, label %if.then, label %if.else
+
+if.then:                                          ; preds = %land.rhs.7
+  br label %for.inc
+
+if.else:                                          ; preds = %land.rhs.7, %for.body
+  %2 = load i8, i8* %in.addr.012, align 1
+  br label %for.inc
+
+for.inc:                                          ; preds = %if.else, %if.then
+  %len.1 = phi i32 [ 0, %if.else ], [ undef, %if.then ]
+  br i1 undef, label %land.rhs, label %for.end
+
+for.end:                                          ; preds = %for.inc, %land.rhs, %entry
+  ret void
+}
+
+; Function Attrs: nounwind uwtable
+declare void @stringcharlen() #0




More information about the llvm-commits mailing list