Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
------------------------------------------------------------------------ r322006 | davide | 2018-01-08 17:34:06 +0100 (Mon, 08 Jan 2018) | 19 lines [CVP] Replace incoming values from unreachable blocks with undef. This is an attempt of fixing PR35807. Due to the non-standard definition of dominance in LLVM, where uses in unreachable blocks are dominated by anything, you can have, in an unreachable block: %patatino = OP1 %patatino, CONSTANT When `SimplifyInstruction` receives a PHI where an incoming value is of the aforementioned form, in some cases, loops indefinitely. What I propose here instead is keeping track of the incoming values from unreachable blocks, and replacing them with undef. It fixes this case, and it seems to be good regardless (even if we can't prove that the value is constant, as it's coming from an unreachable block, we can ignore it). Differential Revision: https://reviews.llvm.org/D41812 ------------------------------------------------------------------------ llvm-svn: 323738
- Loading branch information
Showing
2 changed files
with
89 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
llvm/test/Transforms/CorrelatedValuePropagation/pr35807.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||
; RUN: opt -correlated-propagation -S %s | FileCheck %s | ||
|
||
target triple = "x86_64-apple-darwin17.4.0" | ||
|
||
define void @patatino() { | ||
; CHECK-LABEL: @patatino( | ||
; CHECK-NEXT: br i1 undef, label [[BB3:%.*]], label [[BB4:%.*]] | ||
; CHECK: bb3: | ||
; CHECK-NEXT: br label [[BB3]] | ||
; CHECK: bb4: | ||
; CHECK-NEXT: br i1 undef, label [[BB40:%.*]], label [[BB22:%.*]] | ||
; CHECK: bb7: | ||
; CHECK-NEXT: br label [[BB14:%.*]] | ||
; CHECK: bb12: | ||
; CHECK-NEXT: br label [[BB14]] | ||
; CHECK: bb14: | ||
; CHECK-NEXT: [[TMP19:%.*]] = icmp sgt i32 undef, undef | ||
; CHECK-NEXT: [[TMP20:%.*]] = select i1 [[TMP19]], i64 [[TMP20]], i64 0 | ||
; CHECK-NEXT: br i1 undef, label [[BB40]], label [[BB7:%.*]] | ||
; CHECK: bb22: | ||
; CHECK-NEXT: br label [[BB24:%.*]] | ||
; CHECK: bb24: | ||
; CHECK-NEXT: br label [[BB32:%.*]] | ||
; CHECK: bb32: | ||
; CHECK-NEXT: br i1 undef, label [[BB40]], label [[BB24]] | ||
; CHECK: bb40: | ||
; CHECK-NEXT: ret void | ||
; | ||
br i1 undef, label %bb3, label %bb4 | ||
|
||
bb3: | ||
br label %bb3 | ||
|
||
bb4: | ||
br i1 undef, label %bb40, label %bb22 | ||
|
||
bb7: | ||
br label %bb14 | ||
|
||
bb12: | ||
br label %bb14 | ||
|
||
; This block is unreachable. Due to the non-standard definition of | ||
; dominance in LLVM where uses in unreachable blocks are dominated | ||
; by anything, it contains an instruction of the form | ||
; %def = OP %def, %something | ||
bb14: | ||
%tmp19 = icmp sgt i32 undef, undef | ||
%tmp20 = select i1 %tmp19, i64 %tmp20, i64 0 | ||
br i1 undef, label %bb40, label %bb7 | ||
|
||
bb22: | ||
br label %bb24 | ||
|
||
bb24: | ||
br label %bb32 | ||
|
||
bb32: | ||
br i1 undef, label %bb40, label %bb24 | ||
|
||
bb40: | ||
%tmp41 = phi i64 [ 4, %bb4 ], [ %tmp20, %bb14 ], [ undef, %bb32 ] | ||
ret void | ||
} |