Home | History | Annotate | Download | only in AArch64
      1 # RUN: llc -mtriple=aarch64-apple-ios -run-pass=simple-register-coalescing %s -o - | FileCheck %s
      2 --- |
      3   declare void @f2()
      4 
      5   define void @func0() { ret void }
      6   define void @func1() { ret void }
      7   define void @func2() { ret void }
      8 ...
      9 ---
     10 # Check coalescing of COPYs from reserved physregs.
     11 # CHECK-LABEL: name: func0
     12 name: func0
     13 body: |
     14   bb.0:
     15     ; We usually should not coalesce copies from allocatable physregs.
     16     ; CHECK: %0:gpr32 = COPY $w7
     17     ; CHECK: STRWui %0, $x1, 0
     18     %0 : gpr32 = COPY $w7
     19     STRWui %0, $x1, 0
     20 
     21     ; It is fine to coalesce copies from reserved physregs
     22     ; CHECK-NOT: COPY
     23     ; CHECK: STRXui $fp, $x1, 0
     24     %1 : gpr64 = COPY $fp
     25     STRXui %1, $x1, 0
     26 
     27     ; It is not fine to coalesce copies from reserved physregs when they are
     28     ; clobbered.
     29     ; CHECK: %2:gpr64 = COPY $fp
     30     ; CHECK: STRXui %2, $x1, 0
     31     %2 : gpr64 = COPY $fp
     32     $fp = SUBXri $fp, 4, 0
     33     STRXui %2, $x1, 0
     34 
     35     ; Is is fine to coalesce copies from constant physregs even when they are
     36     ; clobbered.
     37     ; CHECK-NOT: COPY
     38     ; CHECK: STRWui $wzr, $x1
     39     %3 : gpr32 = COPY $wzr
     40     dead $wzr = SUBSWri $w1, 0, 0, implicit-def $nzcv
     41     STRWui %3, $x1, 0
     42 
     43     ; Is is fine to coalesce copies from constant physregs even when they are
     44     ; clobbered.
     45     ; CHECK-NOT: COPY
     46     ; CHECK: STRXui $xzr, $x1
     47     %4 : gpr64 = COPY $xzr
     48     dead $wzr = SUBSWri $w1, 0, 0, implicit-def $nzcv
     49     STRXui %4, $x1, 0
     50 
     51     ; Coalescing COPYs into constant physregs.
     52     ; CHECK: $wzr = SUBSWri $w1, 0, 0
     53     %5 : gpr32 = SUBSWri $w1, 0, 0, implicit-def $nzcv
     54     $wzr = COPY %5
     55 
     56     ; Only coalesce when the source register is reserved as a whole (this is
     57     ; a limitation of the current code which cannot update liveness information
     58     ; of the non-reserved part).
     59     ; CHECK: %6:xseqpairsclass = COPY $x28_fp
     60     ; CHECK: HINT 0, implicit %6
     61     %6 : xseqpairsclass = COPY $x28_fp
     62     HINT 0, implicit %6
     63 
     64     ; It is not fine to coalesce copies from reserved physregs when they are
     65     ; clobbered by the regmask on a call.
     66     ; CHECK: %7:gpr64 = COPY $x18
     67     ; CHECK: BL @f2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
     68     ; CHECK: STRXui %7, $x1, 0
     69 
     70     ; Need a def of x18 so that it's not deduced as "constant".
     71     $x18 = COPY $xzr
     72     %7 : gpr64 = COPY $x18
     73     BL @f2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
     74     STRXui %7, $x1, 0
     75 
     76     ; This can be coalesced.
     77     ; CHECK: $fp = SUBXri $fp, 4, 0
     78     %8 : gpr64sp = SUBXri $fp, 4, 0
     79     $fp = COPY %8
     80 
     81     ; Cannot coalesce when there are reads of the physreg.
     82     ; CHECK-NOT: $fp = SUBXri $fp, 8, 0
     83     ; CHECK: %9:gpr64sp = SUBXri $fp, 8, 0
     84     ; CHECK: STRXui $fp, $fp, 0
     85     ; CHECK: $fp = COPY %9
     86     %9 : gpr64sp = SUBXri $fp, 8, 0
     87     STRXui $fp, $fp, 0
     88     $fp = COPY %9
     89 ...
     90 ---
     91 # Check coalescing of COPYs from reserved physregs.
     92 # CHECK-LABEL: name: func1
     93 name: func1
     94 body: |
     95   bb.0:
     96     ; Cannot coalesce physreg because we have reads on other CFG paths (we
     97     ; currently abort for any control flow)
     98     ; CHECK-NOT: $fp = SUBXri
     99     ; CHECK: %0:gpr64sp = SUBXri $fp, 12, 0
    100     ; CHECK: CBZX undef $x0, %bb.1
    101     ; CHECK: B %bb.2
    102     %0 : gpr64sp = SUBXri $fp, 12, 0
    103     CBZX undef $x0, %bb.1
    104     B %bb.2
    105 
    106   bb.1:
    107     $fp = COPY %0
    108     RET_ReallyLR
    109 
    110   bb.2:
    111     STRXui $fp, $fp, 0
    112     RET_ReallyLR
    113 ...
    114 ---
    115 # CHECK-LABEL: name: func2
    116 name: func2
    117 body: |
    118   bb.0:
    119     ; We can coalesce copies from physreg to vreg across multiple blocks.
    120     ; CHECK-NOT: COPY
    121     ; CHECK: CBZX undef $x0, %bb.1
    122     ; CHECK-NEXT: B %bb.2
    123     %0 : gpr64sp = COPY $fp
    124     CBZX undef $x0, %bb.1
    125     B %bb.2
    126 
    127   bb.1:
    128     ; CHECK: STRXui undef $x0, $fp, 0
    129     ; CHECK-NEXT: RET_ReallyLR
    130     STRXui undef $x0, %0, 0
    131     RET_ReallyLR
    132 
    133   bb.2:
    134     RET_ReallyLR
    135 ...
    136