1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00
llvm-mirror/test/CodeGen/SystemZ/int-cmp-58.mir
Jonas Paulsson 61f35cd2aa [SystemZ] Bugfix and improve the handling of CC values.
It was recently discovered that the handling of CC values was actually broken
since overflow was not properly handled ('nsw' flag not checked for).

Add and sub instructions now have a new target specific instruction flag
named SystemZII::CCIfNoSignedWrap. It means that the CC result can be used
instead of a compare with 0, but only if the instruction has the 'nsw' flag
set.

This patch also adds the improvements of conversion to logical instructions
and the analyzing of add with immediates, to be able to eliminate more
compares.

Review: Ulrich Weigand
https://reviews.llvm.org/D66868
2019-12-20 10:20:23 -08:00

72 lines
2.8 KiB
YAML

# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=postrapseudos %s \
# RUN: -o - | FileCheck %s
#
# Test that the CC values of logical adds and subs can be used in compare
# elimination in the cases of EQ/NE.
# CHECK-LABEL: fun0:
# CHECK: alr %r3, %r2
# CHECK-NEXT: locrhe %r2, %r3
# CHECK-NEXT: alr %r3, %r2
# CHECK-NEXT: locrnhe %r2, %r3
# CHECK-NEXT: alr %r3, %r2
# CHECK-NEXT: chi %r3, 0
# CHECK-NEXT: locrle %r2, %r3
# CHECK-NEXT: alr %r3, %r2
# CHECK-NEXT: chi %r3, 0
# CHECK-NEXT: locrhe %r2, %r3
# CHECK-NEXT: slrk %r3, %r2, %r3
# CHECK-NEXT: locrh %r2, %r3
# CHECK-NEXT: slrk %r3, %r2, %r3
# CHECK-NEXT: locrnhe %r2, %r3
# CHECK-NEXT: slrk %r3, %r2, %r3
# CHECK-NEXT: chi %r3, 0
# CHECK-NEXT: locrle %r2, %r3
# CHECK-NEXT: slrk %r3, %r2, %r3
# CHECK-NEXT: chi %r3, 0
# CHECK-NEXT: locrhe %r2, %r3
--- |
define i32 @fun0(i32 %arg1, i32 %arg2) { bb: ret i32 0 }
...
---
name: fun0
body: |
bb.0:
renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 8, implicit killed $cc
renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 6, implicit killed $cc
renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 12, implicit killed $cc
renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 10, implicit killed $cc
renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 8, implicit killed $cc
renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 6, implicit killed $cc
renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 12, implicit killed $cc
renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc
CHIMux renamable $r3l, 0, implicit-def $cc
renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 10, implicit killed $cc
Return implicit $r2l
...