Fix coalescing with IMPLICIT_DEF values.

PHIElimination inserts IMPLICIT_DEF instructions to guarantee that all
PHI predecessors have a live-out value. These IMPLICIT_DEF values are
not considered to be real interference when coalescing virtual
registers:

  %vreg1 = IMPLICIT_DEF
  %vreg2 = MOV32r0

When joining %vreg1 and %vreg2, the IMPLICIT_DEF instruction and its
value number should simply be erased since the %vreg2 value number now
provides a live-out value for the PHI predecesor block.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165813 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2012-10-12 18:03:04 +00:00
parent 5628920346
commit 795f951c6d
2 changed files with 157 additions and 21 deletions
+103
View File
@@ -477,3 +477,106 @@ for.inc: ; preds = %for.cond
}
declare void @fn3(...)
; Check coalescing of IMPLICIT_DEF instructions:
;
; %vreg1 = IMPLICIT_DEF
; %vreg2 = MOV32r0
;
; When coalescing %vreg1 and %vreg2, the IMPLICIT_DEF instruction should be
; erased along with its value number.
;
define void @rdar12474033() nounwind ssp {
bb:
br i1 undef, label %bb21, label %bb1
bb1: ; preds = %bb
switch i32 undef, label %bb10 [
i32 4, label %bb2
i32 1, label %bb9
i32 5, label %bb3
i32 6, label %bb3
i32 2, label %bb9
]
bb2: ; preds = %bb1
unreachable
bb3: ; preds = %bb1, %bb1
br i1 undef, label %bb4, label %bb5
bb4: ; preds = %bb3
unreachable
bb5: ; preds = %bb3
%tmp = load <4 x float>* undef, align 1
%tmp6 = bitcast <4 x float> %tmp to i128
%tmp7 = load <4 x float>* undef, align 1
%tmp8 = bitcast <4 x float> %tmp7 to i128
br label %bb10
bb9: ; preds = %bb1, %bb1
unreachable
bb10: ; preds = %bb5, %bb1
%tmp11 = phi i128 [ undef, %bb1 ], [ %tmp6, %bb5 ]
%tmp12 = phi i128 [ 0, %bb1 ], [ %tmp8, %bb5 ]
switch i32 undef, label %bb21 [
i32 2, label %bb18
i32 3, label %bb13
i32 5, label %bb16
i32 6, label %bb17
i32 1, label %bb18
]
bb13: ; preds = %bb10
br i1 undef, label %bb15, label %bb14
bb14: ; preds = %bb13
br label %bb21
bb15: ; preds = %bb13
unreachable
bb16: ; preds = %bb10
unreachable
bb17: ; preds = %bb10
unreachable
bb18: ; preds = %bb10, %bb10
%tmp19 = bitcast i128 %tmp11 to <4 x float>
%tmp20 = bitcast i128 %tmp12 to <4 x float>
br label %bb21
bb21: ; preds = %bb18, %bb14, %bb10, %bb
%tmp22 = phi <4 x float> [ undef, %bb ], [ undef, %bb10 ], [ undef, %bb14 ], [ %tmp20, %bb18 ]
%tmp23 = phi <4 x float> [ undef, %bb ], [ undef, %bb10 ], [ undef, %bb14 ], [ %tmp19, %bb18 ]
store <4 x float> %tmp23, <4 x float>* undef, align 16
store <4 x float> %tmp22, <4 x float>* undef, align 16
switch i32 undef, label %bb29 [
i32 5, label %bb27
i32 1, label %bb24
i32 2, label %bb25
i32 14, label %bb28
i32 4, label %bb26
]
bb24: ; preds = %bb21
unreachable
bb25: ; preds = %bb21
br label %bb29
bb26: ; preds = %bb21
br label %bb29
bb27: ; preds = %bb21
unreachable
bb28: ; preds = %bb21
br label %bb29
bb29: ; preds = %bb28, %bb26, %bb25, %bb21
unreachable
}