brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · f4fed03 Raw
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