# RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ # RUN: -run-pass hexagon-qfp-optimizer -run-pass machineverifier %s -o - | FileCheck %s # Test that the killed RegState from DefMI operands are removed # killed RegState should be set for MI operands # CHECK-LABEL: name: qfpAdd # CHECK: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG1:([0-9]+)]] # CHECK-NEXT: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG2:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32 killed %[[REG1]], killed %[[REG2]] # CHECK-NEXT: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG3:([0-9]+)]] # CHECK-NEXT: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG4:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32 killed %[[REG3]], killed %[[REG4]] --- name: qfpAdd tracksRegLiveness: true body: | bb.0: liveins: $r0, $r1, $r2, $r3 %0:intregs = COPY $r0 %1:intregs = COPY $r1 %2:intregs = COPY $r2 %3:intregs = COPY $r3 %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 %6:hvxvr = V6_vL32Ub_ai %2:intregs, 0 %7:hvxvr = V6_vL32Ub_ai %3:intregs, 0 %8:hvxvr = V6_vconv_sf_qf32 killed %4:hvxvr %9:hvxvr = V6_vconv_sf_qf32 killed %5:hvxvr %10:hvxvr = V6_vadd_sf %8:hvxvr, %9:hvxvr %11:hvxvr = V6_vconv_sf_qf32 killed %6:hvxvr %12:hvxvr = V6_vconv_sf_qf32 killed %7:hvxvr %13:hvxvr = V6_vadd_sf killed %11:hvxvr, killed %12:hvxvr ... # Test that the killed RegState from DefMI operands are removed # CHECK-LABEL: name: qfpAddMix # CHECK: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG1:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32_mix killed %[[REG1]], %{{[0-9]+}} # CHECK: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG2:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32_mix killed %[[REG2]], %{{[0-9]+}} --- name: qfpAddMix tracksRegLiveness: true body: | bb.0: liveins: $r0, $r1, $r2 %0:intregs = COPY $r0 %1:intregs = COPY $r1 %2:intregs = COPY $r2 %3:hvxvr = V6_vL32Ub_ai %0:intregs, 0 %4:hvxvr = V6_vL32Ub_ai %1:intregs, 0 %5:hvxvr = V6_vL32Ub_ai %2:intregs, 0 %6:hvxvr = V6_vmpy_qf32_sf %4, %5 %7:hvxvr = V6_vconv_sf_qf32 killed %6:hvxvr %8:hvxvr = V6_vadd_sf %3:hvxvr, %7:hvxvr %9:hvxvr = V6_vmpy_qf32_sf %4, %5 %10:hvxvr = V6_vconv_sf_qf32 killed %9:hvxvr %11:hvxvr = V6_vadd_sf %3:hvxvr, killed %10:hvxvr ... # Test that we do generate V6_vsub_qf32_mix for the below test. # V6_vsub_qf32_mix only allowes qf32 as first operand. In the test qf32 # is passed as first operand. So, V6_vsub_qf32_mix must be generated. # CHECK-LABEL: name: qfpAddSwapMix # CHECK: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG1:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32_mix killed %[[REG1]], %{{[0-9]+}} # CHECK: %{{[0-9]+}}:hvxvr = V6_vconv_sf_qf32 %[[REG2:([0-9]+)]] # CHECK-NEXT: V6_vadd_qf32_mix killed %[[REG2]], %{{[0-9]+}} --- name: qfpAddSwapMix tracksRegLiveness: true body: | bb.0: liveins: $r0, $r1, $r2 %0:intregs = COPY $r0 %1:intregs = COPY $r1 %2:intregs = COPY $r2 %3:hvxvr = V6_vL32Ub_ai %0:intregs, 0 %4:hvxvr = V6_vL32Ub_ai %1:intregs, 0 %5:hvxvr = V6_vL32Ub_ai %2:intregs, 0 %6:hvxvr = V6_vmpy_qf32_sf %4, %5 %7:hvxvr = V6_vconv_sf_qf32 killed %6:hvxvr %8:hvxvr = V6_vadd_sf %7:hvxvr, %3:hvxvr %9:hvxvr = V6_vmpy_qf32_sf %4, %5 %10:hvxvr = V6_vconv_sf_qf32 killed %9:hvxvr %11:hvxvr = V6_vadd_sf killed %10:hvxvr, %3:hvxvr ...