mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
61f35cd2aa
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
72 lines
2.8 KiB
YAML
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
|
|
...
|