mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
01646554f8
Currently, an instruction setting the condition code is linked to the instruction using the condition code via a "glue" link in the SelectionDAG. This has a number of drawbacks; in particular, it means the same CC cannot be used by multiple users. It also makes it more difficult to efficiently implement SADDO et. al. This patch changes the back-end to represent CC dependencies as normal values during SelectionDAG matching, along the lines of how this is handled in the X86 back-end already. In addition to the core mechanics of updating all relevant patterns, this requires a number of additional changes: - We now need to be able to spill/restore a CC value into a GPR if necessary. This means providing a copyPhysReg implementation for moves involving CC, and defining getCrossCopyRegClass. - Since we still prefer to avoid such spills, we provide an override for IsProfitableToFold to avoid creating a merged LOAD / ICMP if this would result in multiple users of the CC. - combineCCMask no longer requires a single CC user, and no longer need to be careful about preventing invalid glue/chain cycles. - emitSelect needs to be more careful in marking CC live-in to the basic block it generates. Also, we can now optimize the case of multiple subsequent selects with the same condition just like X86 does. llvm-svn: 331202
22 lines
639 B
LLVM
22 lines
639 B
LLVM
; Test that multiple select statements using the same condition are expanded
|
|
; into a single conditional branch.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
|
|
|
define void @test(i32 signext %positive, double %base, double %offset, double* %rmin, double* %rmax) {
|
|
entry:
|
|
; CHECK: cijlh %r2, 0,
|
|
; CHECK-NOT: cij
|
|
; CHECK-NOT: je
|
|
; CHECK-NOT: jlh
|
|
|
|
%tobool = icmp eq i32 %positive, 0
|
|
%add = fadd double %base, %offset
|
|
%min = select i1 %tobool, double %add, double %base
|
|
%max = select i1 %tobool, double %base, double %add
|
|
store double %min, double* %rmin, align 8
|
|
store double %max, double* %rmax, align 8
|
|
ret void
|
|
}
|
|
|