mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +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
20 lines
403 B
LLVM
20 lines
403 B
LLVM
; Check that we don't insert unnecessary CC spills
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu
|
|
|
|
declare signext i32 @f()
|
|
|
|
define signext i32 @test(i32* %ptr) {
|
|
; CHECK-NOT: ipm
|
|
|
|
entry:
|
|
%0 = load i32, i32* %ptr, align 4
|
|
%tobool = icmp eq i32 %0, 0
|
|
%call = tail call signext i32 @f()
|
|
%1 = icmp slt i32 %call, 40
|
|
%2 = or i1 %tobool, %1
|
|
%retv = select i1 %2, i32 %call, i32 40
|
|
ret i32 %retv
|
|
}
|
|
|