mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
46d58287e3
- MIParser: If the successor list is not specified successors will be added based on basic block operands in the block and possible fallthrough. - MIRPrinter: Adds a new `simplify-mir` option, with that option set: Skip printing of block successor lists in cases where the parser is guaranteed to reconstruct it. This means we still print the list if some successor cannot be determined (happens for example for jump tables), if the successor order changes or branch probabilities being unequal. Differential Revision: https://reviews.llvm.org/D31262 llvm-svn: 302289
611 lines
12 KiB
YAML
611 lines
12 KiB
YAML
# RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s
|
|
---
|
|
# Check that bb.0 COPY is seen through to allow the bb.1 COPY of XZR to be removed.
|
|
# CHECK-LABEL: name: test1
|
|
# CHECK-NOT: COPY %xzr
|
|
name: test1
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1
|
|
|
|
%x0 = COPY %x1
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test1, but with reversed COPY.
|
|
# CHECK-LABEL: name: test2
|
|
# CHECK-NOT: COPY %xzr
|
|
name: test2
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1
|
|
|
|
%x1 = COPY %x0
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test1, but with a clobber that prevents removal of the XZR COPY.
|
|
# CHECK-LABEL: name: test3
|
|
# CHECK: COPY %xzr
|
|
name: test3
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1, %x2
|
|
|
|
%x0 = COPY %x1
|
|
%x1 = LDRXui %x1, 0
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test2, but with a clobber that prevents removal of the XZR COPY.
|
|
# CHECK-LABEL: name: test4
|
|
# CHECK: COPY %xzr
|
|
name: test4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1, %x2
|
|
|
|
%x1 = COPY %x0
|
|
%x1 = LDRXui %x1, 0
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test2, but with a clobber that prevents removal of the XZR COPY.
|
|
# CHECK-LABEL: name: test5
|
|
# CHECK: COPY %xzr
|
|
name: test5
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1, %x2
|
|
|
|
%x1 = COPY %x0
|
|
%x0 = LDRXui %x1, 0
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test1, but with two levels of COPYs.
|
|
# CHECK-LABEL: name: test6
|
|
# CHECK-NOT: COPY %xzr
|
|
name: test6
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1, %x2
|
|
|
|
%x2 = COPY %x0
|
|
%x1 = COPY %x2
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Similar to test1, but with two levels of COPYs and a clobber preventing COPY of XZR removal.
|
|
# CHECK-LABEL: name: test7
|
|
# CHECK: COPY %xzr
|
|
name: test7
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1, %x2
|
|
|
|
%x2 = COPY %x0
|
|
%x0 = LDRXui %x1, 0
|
|
%x1 = COPY %x2
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Check that the TargetRegs vector clobber update loop in
|
|
# AArch64RedundantCopyElimination::optimizeCopy works correctly.
|
|
# CHECK-LABEL: name: test8
|
|
# CHECK: x0 = COPY %xzr
|
|
# CHECK: x1 = COPY %xzr
|
|
name: test8
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1
|
|
|
|
%x1 = COPY %x0
|
|
CBNZX %x1, %bb.2
|
|
|
|
bb.1:
|
|
liveins: %x0, %x2
|
|
|
|
%x0, %x1 = LDPXi %x2, 0
|
|
%x0 = COPY %xzr
|
|
%x1 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Check that copy isn't removed from a block with multiple predecessors.
|
|
# CHECK-LABEL: name: test9
|
|
# CHECK: x0 = COPY %xzr
|
|
# CHECK-NEXT: B %bb.3
|
|
name: test9
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1
|
|
|
|
CBNZX %x0, %bb.2
|
|
|
|
bb.1:
|
|
liveins: %x0, %x2
|
|
|
|
%x0 = COPY %xzr
|
|
B %bb.3
|
|
|
|
bb.2:
|
|
liveins: %x1
|
|
|
|
%x0 = LDRXui %x1, 0
|
|
|
|
CBNZX %x1, %bb.1
|
|
|
|
bb.3:
|
|
liveins: %x0
|
|
|
|
RET_ReallyLR implicit %x0
|
|
|
|
...
|
|
# Eliminate redundant MOVi32imm 7 in bb.1
|
|
# Note: 32-bit compare/32-bit move imm
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test10
|
|
# CHECK: SUBSWri %w0, 7, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test10
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi32imm 7 in bb.1
|
|
# Note: 64-bit compare/32-bit move imm w/implicit def
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test11
|
|
# CHECK: SUBSXri %x0, 7, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test11
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %x0, %x1
|
|
|
|
dead %xzr = SUBSXri killed %x0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7, implicit-def %x0
|
|
STRXui killed %x0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi32imm 7 in bb.1
|
|
# Note: 64-bit compare/32-bit move imm
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test12
|
|
# CHECK: SUBSXri %x0, 7, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test12
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %x0, %x1
|
|
|
|
dead %xzr = SUBSXri killed %x0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Don't eliminate MOVi32imm 7 in bb.1 as we don't necessarily know the upper 32-bits.
|
|
# Note: 32-bit compare/32-bit move imm w/implicit def
|
|
# Kill marker should remain on compare.
|
|
# CHECK-LABEL: name: test13
|
|
# CHECK: SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi32imm
|
|
name: test13
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7, implicit-def %x0
|
|
STRXui killed %x0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# We can't eliminate the MOVi32imm because of the clobbering LDRWui.
|
|
# CHECK-LABEL: name: test14
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi32imm
|
|
name: test14
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1, %x2
|
|
|
|
dead %wzr = SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
%w0 = LDRWui %x1, 0
|
|
STRWui killed %w0, killed %x2, 0
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# We can't eliminate the MOVi32imm because of the clobbering LDRWui.
|
|
# CHECK-LABEL: name: test15
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi32imm
|
|
name: test15
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1, %x2
|
|
|
|
dead %wzr = SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1, %x2
|
|
|
|
%w0 = LDRWui %x1, 0
|
|
STRWui killed %w0, killed %x2, 0
|
|
%w0 = MOVi32imm 7
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Check that bb.0 COPY is seen through to allow the bb.1 MOVi32imm to be removed.
|
|
# CHECK-LABEL: name: test16
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test16
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = SUBSWri %w0, 7, 0, implicit-def %nzcv
|
|
%w2 = COPY %w0
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w2 = MOVi32imm 7
|
|
STRWui killed %w2, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Check that bb.1 MOVi32imm is not removed due to self clobbering compare.
|
|
# CHECK-LABEL: name: test17
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi32imm
|
|
name: test17
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %w0 = SUBSWri killed %w0, 7, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 7
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Make sure the MOVi64imm is not removed. In one version of this patch the
|
|
# MOVi64imm immediate was truncated to 32 bits and incorrectly matched because
|
|
# the low 32 bits of 4252017623040 are all zero.
|
|
# CHECK-LABEL: name: test18
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi64imm
|
|
name: test18
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %x0, %x1
|
|
|
|
CBNZX killed %x0, %bb.2
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%x0 = MOVi64imm 4252017623040
|
|
STRXui killed %x0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi32imm -1 in bb.1
|
|
# Note: 32-bit compare/32-bit move imm
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test19
|
|
# CHECK: ADDSWri %w0, 1, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test19
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = ADDSWri killed %w0, 1, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm -1
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi64imm -1 in bb.1
|
|
# Note: 64-bit compare/64-bit move imm
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test20
|
|
# CHECK: ADDSXri %x0, 1, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi64imm
|
|
name: test20
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: %x0, %x1
|
|
|
|
dead %xzr = ADDSXri killed %x0, 1, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%x0 = MOVi64imm -1
|
|
STRXui killed %x0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi32imm -1 in bb.1
|
|
# Note: 64-bit compare/32-bit move imm
|
|
# Kill marker should be removed from compare.
|
|
# CHECK-LABEL: name: test21
|
|
# CHECK: ADDSXri %x0, 1, 0, implicit-def %nzcv
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test21
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %x0, %x1
|
|
|
|
dead %xzr = ADDSXri killed %x0, 1, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm -1
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Don't eliminate MOVi64imm -1 in bb.1 as we don't necessarily know the upper 32-bits.
|
|
# Note: 32-bit compare/64-bit move imm
|
|
# CHECK-LABEL: name: test22
|
|
# CHECK: bb.1:
|
|
# CHECK: MOVi64imm
|
|
name: test22
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = ADDSWri killed %w0, 1, 0, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%x0 = MOVi64imm -1
|
|
STRXui killed %x0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|
|
...
|
|
# Eliminate redundant MOVi32imm 4096 in bb.1 when the compare has a shifted immediate.
|
|
# CHECK-LABEL: name: test23
|
|
# CHECK: bb.1:
|
|
# CHECK-NOT: MOVi32imm
|
|
name: test23
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %w0, %x1
|
|
|
|
dead %wzr = SUBSWri killed %w0, 1, 12, implicit-def %nzcv
|
|
Bcc 1, %bb.2, implicit killed %nzcv
|
|
B %bb.1
|
|
|
|
bb.1:
|
|
liveins: %x1
|
|
|
|
%w0 = MOVi32imm 4096
|
|
STRWui killed %w0, killed %x1, 0
|
|
|
|
bb.2:
|
|
RET_ReallyLR
|