[PATCH] D43994: [GlobalISel][X86] Adding Testgen'd tests for InstructionSelect pass

Roman Tereshin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 1 19:19:29 PST 2018


rtereshin created this revision.
rtereshin added reviewers: qcolombet, ab, dsanders, aditya_nandakumar, bogner, volkan, aemerson, t.p.northover, rovka.
Herald added a subscriber: kristof.beyls.

Requires https://reviews.llvm.org/D43962, see the review for details.

The tests are generated by

  ../../utils/update_instruction_select_testgen_tests.sh ../../test/CodeGen/X86/GlobalISel/x86_64-instruction-select-testgen-testgend.mir llc x86_64-- -testgen-exclude-rules=0,378,379,448,449,450,451,452,453,469,470,471,472,473,474,490,491,492,493,494,495,511,512,513,514,515,516

Interestingly enough, turning ABI speculation off with `-testgen-no-abi`, resulting in defining input vregs with `IMPLICIT_DEF`s rather than actual copies from live-in phys regs, breaks the InstructionSelector more often. It would break on all the rules excluded above, but also on all of the following ones:

  97,98,419,565,626,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744

while having the exact same number of tested generated with `failedISel: true`.

For instance, in abi-on mode Testgen generates the following test case for selection rule #4 (trimmed a little for brevity):

  ---
  name:            test_rule97_id15615_at_idx8289
  alignment:       4
  legalized:       true
  regBankSelected: true
  tracksRegLiveness: true
  registers:
    - { id: 0, class: gpr }
    - { id: 1, class: gpr }
    - { id: 2, class: gpr }
  liveins:
    - { reg: '$eax', virtual-reg: '%1' }
  body:             |
    bb.0.entry:
      liveins: $eax
  
      %1:gpr(s32) = COPY $eax
      %2:gpr(s32) = G_CONSTANT 65535
      %0:gpr(s32) = G_AND %1, %2
      $noreg = PATCHABLE_RET %0(s32)
  ...

that would select just fine to

  name:            test_rule97_id15615_at_idx8289
  alignment:       4
  legalized:       true
  regBankSelected: true
  selected:        true
  tracksRegLiveness: true
  registers:
    - { id: 0, class: gr32 }
    - { id: 1, class: gr32 }
    - { id: 2, class: gpr }
    - { id: 3, class: gr16 }
  liveins:
    - { reg: '$eax', virtual-reg: '%1' }
  body:             |
    bb.0.entry:
      liveins: $eax
  
      %1:gr32 = COPY $eax
      %3:gr16 = COPY %1.sub_16bit
      %0:gr32 = MOVZX32rr16 %3
      $noreg = PATCHABLE_RET %0
  ...

However, in `-testgen-no-abi` mode Testgen would generate this:

  ---
  name:            test_rule97_id15615_at_idx8289
  alignment:       4
  legalized:       true
  regBankSelected: true
  tracksRegLiveness: true
  registers:
    - { id: 0, class: gpr }
    - { id: 1, class: gpr }
    - { id: 2, class: gpr }
  body:             |
    bb.0.entry:
      %1:gpr(s32) = IMPLICIT_DEF
      %2:gpr(s32) = G_CONSTANT 65535
      %0:gpr(s32) = G_AND %1, %2
      $noreg = PATCHABLE_RET %0(s32)
  ...

and x86's InstructionSelector crashes on it with

  Selecting function: test_rule97_id15615_at_idx8289
  Selecting:
    $noreg = PATCHABLE_RET %0:gpr(s32)
  Into:
    $noreg = PATCHABLE_RET %0:gpr(s32)
  
  Selecting:
    %0:gpr(s32) = G_AND %1:gpr, %2:gpr
  Into:
    %3:gr16(s16) = COPY %1.sub_16bit:gpr(s32)
    %0:gr32(s32) = MOVZX32rr16 %3:gr16(s16)
  
  Selecting:
    %2:gpr(s32) = G_CONSTANT 65535
  Is dead; erasing.
  Selecting:
    %1:gpr(s32) = IMPLICIT_DEF
  Into:
    %1:gpr(s32) = IMPLICIT_DEF
  
  Assertion failed: (VRegInfo[Reg].first.is<const TargetRegisterClass *>() && "Register class not set, wrong accessor"), function getRegClass, file ../../include/llvm/CodeGen/MachineRegisterInfo.h, line 607.
  <...>
  6  llc                      0x000000010ed61608 llvm::MachineRegisterInfo::getRegClass(unsigned int) const + 184
  7  llc                      0x00000001100c7fbe llvm::InstructionSelect::runOnMachineFunction(llvm::MachineFunction&) + 3518
  <...>
  Stack dump:
  0.	Program arguments: /Volumes/Data/llvm/build/obj/bin/llc -mtriple x86_64-- -run-pass instruction-select -testgen-set-all-features -disable-gisel-legality-check -verify-machineinstrs -simplify-mir with-no-abi.mir -o - -debug-only=instruction-select
  1.	Running pass 'Function Pass Manager' on module 'with-no-abi.mir'.
  2.	Running pass 'InstructionSelect' on function '@test_rule97_id15615_at_idx8289'

AFAICT the reason for that is only partial support of `EXTRACT_SUBREG` by GlobalISel emitter, which in this case is nested and doesn't restrict its operands' regclasses properly.

I would like to underline in this case that having ABI speculation sometimes allows to generate more tests and reach better coverage, that is one of the design goals of the Testgen.

I'm including the larger test with ABI speculation on in this patch, but I used the smaller one with more tests failing generated with `-testgen-no-abi` for stats presented in Coverage section of https://reviews.llvm.org/D43962


Repository:
  rL LLVM

https://reviews.llvm.org/D43994

Files:
  test/CodeGen/X86/GlobalISel/x86_64-instruction-select-testgen-selected.mir
  test/CodeGen/X86/GlobalISel/x86_64-instruction-select-testgen-testgend.mir





More information about the llvm-commits mailing list