# RUN: llc -mtriple=aarch64-linux-gnu -run-pass machine-cp -mcp-use-is-copy-instr -o - %s | FileCheck %s # Tests for MachineCopyPropagation copy forwarding. --- # Simple forwarding. # CHECK-LABEL: name: test1 # CHECK: $x0 = SUBXri $x0, 1, 0 name: test1 tracksRegLiveness: true body: | bb.0: liveins: $x0 renamable $x1 = COPY $x0 $x0 = SUBXri renamable $x1, 1, 0 ... --- # Don't forward if not renamable. # CHECK-LABEL: name: test2 # CHECK: $x0 = SUBXri $x1, 1, 0 name: test2 tracksRegLiveness: true body: | bb.0: liveins: $x0 $x1 = COPY $x0 $x0 = SUBXri $x1, 1, 0 ... --- # Don't forward reserved non-constant reg values. # CHECK-LABEL: name: test4 # CHECK: $x0 = SUBXri renamable $x1, 1, 0 name: test4 tracksRegLiveness: true body: | bb.0: liveins: $x0 $sp = SUBXri $sp, 16, 0 renamable $x1 = COPY $sp $x0 = SUBXri renamable $x1, 1, 0 $sp = ADDXri $sp, 16, 0 ... --- # Don't violate opcode constraints when forwarding. # CHECK-LABEL: name: test5 # CHECK: $x0 = SUBXri renamable $x1, 1, 0 name: test5 tracksRegLiveness: true body: | bb.0: liveins: $x0 renamable $x1 = COPY $xzr $x0 = SUBXri renamable $x1, 1, 0 ... --- # Test cross-class COPY forwarding. # CHECK-LABEL: name: test6 # CHECK: $x2 = COPY $x0 name: test6 tracksRegLiveness: true body: | bb.0: liveins: $x0 renamable $d1 = COPY $x0 $x2 = COPY renamable $d1 RET_ReallyLR implicit $x2 ... --- # Don't forward if there are overlapping implicit operands. # CHECK-LABEL: name: test7 # CHECK: $w0 = SUBWri killed renamable $w1, 1, 0 name: test7 tracksRegLiveness: true body: | bb.0: liveins: $w0 renamable $w1 = COPY $w0 $w0 = SUBWri killed renamable $w1, 1, 0, implicit killed $x1 ... --- # Check that kill flags are cleared. # CHECK-LABEL: name: test8 # CHECK: $x2 = ADDXri $x0, 1, 0 # CHECK: $x0 = SUBXri $x0, 1, 0 name: test8 tracksRegLiveness: true body: | bb.0: liveins: $x0 renamable $x1 = COPY $x0 $x2 = ADDXri killed $x0, 1, 0 $x0 = SUBXri renamable $x1, 1, 0 ... --- # Don't forward if value is clobbered. # CHECK-LABEL: name: test9 # CHECK: $x2 = SUBXri renamable $x1, 1, 0 name: test9 tracksRegLiveness: true body: | bb.0: liveins: $x0 renamable $x1 = COPY $x0 $x0 = ADDXri $x0, 1, 0 $x2 = SUBXri renamable $x1, 1, 0 ... --- # CHECK-LABEL: name: test1_orr_as_copy # CHECK: STRBBui $wzr, killed renamable $x8, 36 name: test1_orr_as_copy tracksRegLiveness: true body: | bb.0: liveins: $x8 $w9 = ORRWrs $wzr, $wzr, 0 STRBBui killed renamable $w9, killed renamable $x8, 36 ...