256 lines · plain
1# RUN: llc -mtriple=i686-- -run-pass machine-cp -verify-machineinstrs -o - %s | FileCheck %s2 3--- |4 declare void @foo()5 define void @copyprop_remove_kill0() { ret void }6 define void @copyprop_remove_kill1() { ret void }7 define void @copyprop_remove_kill2() { ret void }8 define void @copyprop0() { ret void }9 define void @copyprop1() { ret void }10 define void @copyprop2() { ret void }11 define void @copyprop3() { ret void }12 define void @copyprop4() { ret void }13 define void @nocopyprop0() { ret void }14 define void @nocopyprop1() { ret void }15 define void @nocopyprop2() { ret void }16 define void @nocopyprop3() { ret void }17 define void @nocopyprop4() { ret void }18 define void @nocopyprop5() { ret void }19...20---21# The second copy is redundant and will be removed, check that we also remove22# the kill flag of intermediate instructions.23# CHECK-LABEL: name: copyprop_remove_kill024# CHECK: bb.0:25# CHECK-NEXT: $rax = COPY $rdi26# CHECK-NEXT: NOOP implicit $rdi27# CHECK-NOT: COPY28# CHECK-NEXT: NOOP implicit $rax, implicit $rdi29name: copyprop_remove_kill030body: |31 bb.0:32 $rax = COPY $rdi33 NOOP implicit killed $rdi34 $rdi = COPY $rax35 NOOP implicit $rax, implicit $rdi36...37---38# The second copy is redundant and will be removed, check that we also remove39# the kill flag of intermediate instructions.40# CHECK-LABEL: name: copyprop_remove_kill141# CHECK: bb.0:42# CHECK-NEXT: $rax = COPY $rdi43# CHECK-NEXT: NOOP implicit $edi44# CHECK-NOT: COPY45# CHECK-NEXT: NOOP implicit $rax, implicit $rdi46name: copyprop_remove_kill147body: |48 bb.0:49 $rax = COPY $rdi50 NOOP implicit killed $edi51 $rdi = COPY $rax52 NOOP implicit $rax, implicit $rdi53...54---55# The second copy is redundant and will be removed, check that we also remove56# the kill flag of intermediate instructions.57# CHECK-LABEL: name: copyprop_remove_kill258# CHECK: bb.0:59# CHECK-NEXT: $ax = COPY $di60# CHECK-NEXT: NOOP implicit $rdi61# CHECK-NOT: COPY62# CHECK-NEXT: NOOP implicit $rax, implicit $rdi63name: copyprop_remove_kill264body: |65 bb.0:66 $ax = COPY $di67 NOOP implicit killed $rdi68 $di = COPY $ax69 NOOP implicit $rax, implicit $rdi70...71---72# The second copy is redundant; the call preserves the source and dest register.73# CHECK-LABEL: name: copyprop074# CHECK: bb.0:75# CHECK-NEXT: $rax = COPY $rdi76# CHECK-NEXT: CALL64pcrel32 @foo, csr_64_rt_mostregs77# CHECK-NEXT: NOOP implicit $edi78# CHECK-NOT: COPY79# CHECK-NEXT: NOOP implicit $rax, implicit $rdi80name: copyprop081body: |82 bb.0:83 $rax = COPY $rdi84 CALL64pcrel32 @foo, csr_64_rt_mostregs85 NOOP implicit killed $edi86 $rdi = COPY $rax87 NOOP implicit $rax, implicit $rdi88...89---90# The 2nd copy is redundant; The call preserves the source and dest register.91# CHECK-LABEL: name: copyprop192# CHECK: bb.0:93# CHECK-NEXT: $rax = COPY $rdi94# CHECK-NEXT: NOOP implicit $rax95# CHECK-NEXT: NOOP implicit $rax, implicit $rdi96name: copyprop197body: |98 bb.0:99 $rax = COPY $rdi100 NOOP implicit killed $rax101 $rax = COPY $rdi102 NOOP implicit $rax, implicit $rdi103...104---105# CHECK-LABEL: name: copyprop2106# CHECK: bb.0:107# CHECK-NEXT: $rax = COPY $rdi108# CHECK-NEXT: NOOP implicit $ax109# CHECK-NEXT: CALL64pcrel32 @foo, csr_64_rt_mostregs110# CHECK-NOT: $rax = COPY $rdi111# CHECK-NEXT: NOOP implicit $rax, implicit $rdi112name: copyprop2113body: |114 bb.0:115 $rax = COPY $rdi116 NOOP implicit killed $ax117 CALL64pcrel32 @foo, csr_64_rt_mostregs118 $rax = COPY $rdi119 NOOP implicit $rax, implicit $rdi120...121---122# Check that undef is removed from the remaining copy because123# the deleted COPY did not have it.124# CHECK-LABEL: name: copyprop3125# CHECK: bb.0:126# CHECK: $rax = COPY $rdi127# CHECK-NEXT: NOOP implicit $rax128# CHECK-NEXT: NOOP implicit $rax, implicit $rdi129name: copyprop3130tracksRegLiveness: true131body: |132 bb.0:133 liveins: $rdi134 135 $rax = COPY undef $rdi136 NOOP implicit killed $rax137 $rax = COPY $rdi138 NOOP implicit $rax, implicit $rdi139...140---141# Check that undef is NOT removed from the remaining copy because142# the deleted COPY also had it.143# CHECK-LABEL: name: copyprop4144# CHECK: bb.0:145# CHECK: $rax = COPY undef $rdi146# CHECK-NEXT: NOOP implicit $rax147# CHECK-NEXT: NOOP implicit $rax, implicit $rdi148name: copyprop4149tracksRegLiveness: true150body: |151 bb.0:152 liveins: $rdi153 154 $rax = COPY undef $rdi155 NOOP implicit killed $rax156 $rax = COPY undef $rdi157 NOOP implicit $rax, implicit $rdi158...159---160# The second copy is not redundant if the source register ($rax) is clobbered161# even if the dest ($rbp) is not.162# CHECK-LABEL: name: nocopyprop0163# CHECK: bb.0:164# CHECK-NEXT: $rax = COPY $rbp165# CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp166# CHECK-NEXT: $rbp = COPY $rax167# CHECK-NEXT: NOOP implicit $rax, implicit $rbp168name: nocopyprop0169body: |170 bb.0:171 $rax = COPY $rbp172 CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp173 $rbp = COPY $rax174 NOOP implicit $rax, implicit $rbp175...176---177# The second copy is not redundant if the dest register ($rax) is clobbered178# even if the source ($rbp) is not.179# CHECK-LABEL: name: nocopyprop1180# CHECK: bb.0:181# CHECK-NEXT: $rbp = COPY $rax182# CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp183# CHECK-NEXT: $rax = COPY $rbp184# CHECK-NEXT: NOOP implicit $rax, implicit $rbp185name: nocopyprop1186body: |187 bb.0:188 $rbp = COPY $rax189 CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp190 $rax = COPY $rbp191 NOOP implicit $rax, implicit $rbp192...193---194# The second copy is not redundant if the source register ($rax) is clobbered195# even if the dest ($rbp) is not.196# CHECK-LABEL: name: nocopyprop2197# CHECK: bb.0:198# CHECK-NEXT: $rax = COPY $rbp199# CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp200# CHECK-NEXT: $rax = COPY $rbp201# CHECK-NEXT: NOOP implicit $rax, implicit $rbp202name: nocopyprop2203body: |204 bb.0:205 $rax = COPY $rbp206 CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp207 $rax = COPY $rbp208 NOOP implicit $rax, implicit $rbp209...210---211# The second copy is not redundant if the dest register ($rax) is clobbered212# even if the source ($rbp) is not.213# CHECK-LABEL: name: nocopyprop3214# CHECK: bb.0:215# CHECK-NEXT: $rbp = COPY $rax216# CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp217# CHECK-NEXT: $rbp = COPY $rax218# CHECK-NEXT: NOOP implicit $rax, implicit $rbp219name: nocopyprop3220body: |221 bb.0:222 $rbp = COPY $rax223 CALL64pcrel32 @foo, csr_64, implicit $rax, implicit $rbp224 $rbp = COPY $rax225 NOOP implicit $rax, implicit $rbp226...227---228# A reserved register may change its value so the 2nd copy is not redundant.229# CHECK-LABEL: name: nocopyprop4230# CHECK: bb.0:231# CHECK-NEXT: $rax = COPY $rip232# CHECK-NEXT: NOOP implicit $rax233# CHECK-NEXT: $rax = COPY $rip234# CHECK-NEXT: NOOP implicit $rax235name: nocopyprop4236body: |237 bb.0:238 $rax = COPY $rip239 NOOP implicit $rax240 $rax = COPY $rip241 NOOP implicit $rax242...243---244# Writing to a reserved register may have additional effects (slightly illegal245# testcase because writing to $rip like this should make the instruction a jump)246# CHECK-LABEL: name: nocopyprop5247# CHECK: bb.0:248# CHECK-NEXT: $rip = COPY $rax249# CHECK-NEXT: $rip = COPY $rax250name: nocopyprop5251body: |252 bb.0:253 $rip = COPY $rax254 $rip = COPY $rax255...256