1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/CodeGen/SystemZ/int-cmp-55.ll
Ulrich Weigand 01646554f8 [SystemZ] Do not use glue to represent condition code dependencies
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
2018-04-30 17:52:32 +00:00

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
}