mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user