| # RUN: llc -O0 -mtriple aarch64-apple-ios %s -global-isel -start-after regbankselect \ |
| # RUN: -stop-before instruction-select -o - | FileCheck --check-prefix=CHECK --check-prefix=OPTNONE %s |
| # RUN: llc -mtriple aarch64-apple-ios %s -global-isel -start-after regbankselect \ |
| # RUN: -stop-before instruction-select -o - | FileCheck --check-prefix=CHECK --check-prefix=OPT %s |
| # |
| # Check that we are only running the localizer at O0 and that it runs |
| # between the regbankselect pass and the instruction-select. |
| # Moreover, check that it does what we expect. |
| --- | |
| target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" |
| target triple = "aarch64-apple-ios" |
| |
| define float @foo(float %arg, i1 %cond) { |
| br i1 %cond, label %true, label %false |
| |
| true: ; preds = %0 |
| br label %end |
| |
| false: ; preds = %0 |
| br label %end |
| |
| end: ; preds = %false, %true |
| %val = phi float [ 1.000000e+00, %true ], [ 2.000000e+00, %false ] |
| %res = fadd float %arg, %val |
| ret float %res |
| } |
| |
| ... |
| --- |
| # CHECK-LABEL: name: foo |
| name: foo |
| alignment: 2 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| registers: |
| # CHECK: registers: |
| # CHECK-NEXT: - { id: 0, class: fpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 1, class: gpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 2, class: fpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 3, class: fpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 4, class: fpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 5, class: fpr, preferred-register: '' } |
| # CHECK-NEXT: - { id: 6, class: gpr, preferred-register: '' } |
| # The localizer will create two new values to materialize the constants. |
| # OPTNONE-NEXT: - { id: 7, class: fpr, preferred-register: '' } |
| # OPTNONE-NEXT: - { id: 8, class: fpr, preferred-register: '' } |
| - { id: 0, class: fpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: fpr } |
| - { id: 3, class: fpr } |
| - { id: 4, class: fpr } |
| - { id: 5, class: fpr } |
| - { id: 6, class: gpr } |
| |
| # First block remains untouched |
| # CHECK: body |
| # CHECK: %4:fpr(s32) = G_FCONSTANT float 1.000000e+00 |
| # CHECK: %5:fpr(s32) = G_FCONSTANT float 2.000000e+00 |
| |
| # Second block will get the constant 1.0 when the localizer is enabled. |
| # CHECK: bb.1.{{[a-zA-Z0-9]+}}: |
| # OPT-NOT: G_FCONSTANT |
| # OPTNONE: [[FONE:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00 |
| # CHECK: G_BR %bb.3 |
| |
| # Thrid block will get the constant 2.0 when the localizer is enabled. |
| # CHECK: bb.2.{{[a-zA-Z0-9]+}}: |
| # OPT-NOT: G_FCONSTANT |
| # OPTNONE: [[FTWO:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 2.000000e+00 |
| |
| # CHECK: bb.3.end |
| # OPTNONE: %2:fpr(s32) = PHI [[FONE]](s32), %bb.1, [[FTWO]](s32), %bb.2 |
| # OPT: %2:fpr(s32) = PHI %4(s32), %bb.1, %5(s32), %bb.2 |
| # CHECK-NEXT: G_FADD %0, %2 |
| body: | |
| bb.0 (%ir-block.0): |
| liveins: $s0, $w0 |
| |
| %0(s32) = COPY $s0 |
| %6(s32) = COPY $w0 |
| %1(s1) = G_TRUNC %6 |
| %4(s32) = G_FCONSTANT float 1.000000e+00 |
| %5(s32) = G_FCONSTANT float 2.000000e+00 |
| G_BRCOND %1(s1), %bb.1 |
| G_BR %bb.2 |
| |
| bb.1.true: |
| G_BR %bb.3 |
| |
| bb.2.false: |
| |
| bb.3.end: |
| %2(s32) = PHI %4(s32), %bb.1, %5(s32), %bb.2 |
| %3(s32) = G_FADD %0, %2 |
| $s0 = COPY %3(s32) |
| RET_ReallyLR implicit $s0 |
| |
| ... |