summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen')
-rw-r--r--llvm/test/CodeGen/AArch64/machine-zero-copy-remove.mir565
1 files changed, 565 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/machine-zero-copy-remove.mir b/llvm/test/CodeGen/AArch64/machine-zero-copy-remove.mir
new file mode 100644
index 00000000000..3f25c071557
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/machine-zero-copy-remove.mir
@@ -0,0 +1,565 @@
+# RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s
+---
+# CHECK-LABEL: name: test1
+# CHECK: ANDSWri %w0, 1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test1
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %x1, %x2
+
+ %w0 = ANDSWri %w0, 1, implicit-def %nzcv
+ STRWui killed %w0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test2
+# CHECK: ANDSXri %x0, 1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test2
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2
+
+ %x0 = ANDSXri %x0, 1, implicit-def %nzcv
+ STRXui killed %x0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test3
+# CHECK: ADDSWri %w0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test3
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %x1, %x2
+
+ %w0 = ADDSWri %w0, 1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test4
+# CHECK: ADDSXri %x0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test4
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2
+
+ %x0 = ADDSXri %x0, 1, 0, implicit-def %nzcv
+ STRXui killed %x0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test5
+# CHECK: SUBSWri %w0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test5
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %x1, %x2
+
+ %w0 = SUBSWri %w0, 1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test6
+# CHECK: SUBSXri %x0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test6
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2
+
+ %x0 = SUBSXri %x0, 1, 0, implicit-def %nzcv
+ STRXui killed %x0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test7
+# CHECK: ADDSWrr %w0, %w1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test7
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = ADDSWrr %w0, %w1, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test8
+# CHECK: ADDSXrr %x0, %x1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test8
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = ADDSXrr %x0, %x1, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test9
+# CHECK: ANDSWrr %w0, %w1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test9
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = ANDSWrr %w0, %w1, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test10
+# CHECK: ANDSXrr %x0, %x1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test10
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = ANDSXrr %x0, %x1, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test11
+# CHECK: BICSWrr %w0, %w1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test11
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = BICSWrr %w0, %w1, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test12
+# CHECK: BICSXrr %x0, %x1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test12
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = BICSXrr %x0, %x1, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test13
+# CHECK: SUBSWrr %w0, %w1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test13
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = SUBSWrr %w0, %w1, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test14
+# CHECK: SUBSXrr %x0, %x1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test14
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = SUBSXrr %x0, %x1, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test15
+# CHECK: ADDSWrs %w0, %w1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test15
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = ADDSWrs %w0, %w1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test16
+# CHECK: ADDSXrs %x0, %x1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test16
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = ADDSXrs %x0, %x1, 0, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test17
+# CHECK: ANDSWrs %w0, %w1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test17
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = ANDSWrs %w0, %w1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test18
+# CHECK: ANDSXrs %x0, %x1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %xzr
+name: test18
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2, %x3
+
+ %x0 = ANDSXrs %x0, %x1, 0, implicit-def %nzcv
+ STRXui killed %x0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %x0 = COPY %xzr
+ STRXui killed %x0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# CHECK-LABEL: name: test19
+# CHECK: BICSWrs %w0, %w1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: COPY %wzr
+name: test19
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %w1, %x2, %x3
+
+ %w0 = BICSWrs %w0, %w1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x2, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x3
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x3, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# Unicorn test - we can remove a redundant copy and a redundant mov
+# CHECK-LABEL: name: test20
+# CHECK: SUBSWri %w1, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK-NOT: %w0 = COPY %wzr
+# CHECK-NOT: %w1 = MOVi32imm 1
+name: test20
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w1, %x2
+
+ %w0 = SUBSWri %w1, 1, 0, implicit-def %nzcv
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ %w1 = MOVi32imm 1
+ STRWui killed %w0, %x2, 0
+ STRWui killed %w1, killed %x2, 1
+
+ bb.2:
+ RET_ReallyLR
+
+...
+# Negative test - MOVi32imm clobbers %w0
+# CHECK-LABEL: name: test21
+# CHECK: ANDSWri %w0, 1, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK: %w0 = COPY %wzr
+name: test21
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %x1, %x2
+
+ %w0 = ANDSWri %w0, 1, implicit-def %nzcv
+ STRWui killed %w0, %x1, 0
+ %w0 = MOVi32imm -1
+ STRWui killed %w0, killed %x1, 1
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# Negative test - SUBSXri self-clobbers x0, so MOVi64imm can't be removed
+# CHECK-LABEL: name: test22
+# CHECK: SUBSXri %x0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK: %x0 = MOVi64imm 1
+name: test22
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %x0, %x1, %x2
+
+ %x0 = SUBSXri %x0, 1, 0, implicit-def %nzcv
+ STRXui killed %x0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %x0 = MOVi64imm 1
+ STRXui killed %x0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
+...
+# Negative test - bb.1 has multiple preds
+# CHECK-LABEL: name: test23
+# CHECK: ADDSWri %w0, 1, 0, implicit-def %nzcv
+# CHECK: bb.1:
+# CHECK: COPY %wzr
+name: test23
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: %w0, %x1, %x2
+
+ %w0 = ADDSWri %w0, 1, 0, implicit-def %nzcv
+ STRWui killed %w0, killed %x1, 0
+ Bcc 1, %bb.2, implicit killed %nzcv
+ B %bb.1
+
+ bb.3:
+ B %bb.1
+
+ bb.1:
+ liveins: %x2
+
+ %w0 = COPY %wzr
+ STRWui killed %w0, killed %x2, 0
+
+ bb.2:
+ RET_ReallyLR
OpenPOWER on IntegriCloud