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
|
|
...
|