[PATCH] D44704: [GlobalISel][X86][ARM] Relaxing type constraints on G_SHL and friends

Roman Tereshin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 30 14:10:26 PDT 2018


rtereshin added a comment.

Here's a fine example of the issue mentioned earlier:

This is how we legalize `G_INTTOPTR` for AArch64 right now:

  getActionDefinitionsBuilder(G_INTTOPTR)
      .unsupportedIf([&](const LegalityQuery &Query) {
        return Query.Types[0].getSizeInBits() != Query.Types[1].getSizeInBits();
      })
      .legalFor({s64, p0});

(https://github.com/llvm-mirror/llvm/blob/27c28519031032a11a917fa4dbf05417fbe78740/lib/Target/AArch64/AArch64LegalizerInfo.cpp#L215-L219)

Who can spot a problem?

In fact, 2 problems at once. I'm working on a simple validation for `LegalizerInfo` that would catch this.

SPOILERS below:

a tip, the following MIR:

  --- |
    target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
    target triple = "aarch64--"
    
    define i64 @broken(<4 x i16> %v) {
      %res = bitcast <4 x i16> %v to i64
      ret i64 %res
    }
  
  ...
  ---
  name:            broken
  alignment:       2
  tracksRegLiveness: true
  registers:       
    - { id: 0, class: _ }
    - { id: 1, class: _ }
  body:             |
    bb.1 (%ir-block.0):
      liveins: $d0
    
      %0:_(<4 x s16>) = COPY $d0
      %1:_(s64) = G_INTTOPTR %0(<4 x s16>)
      $x0 = COPY %1(s64)
      RET_ReallyLR implicit $x0
  
  ...

will be successfully legalized by

  ./bin/llc -run-pass=legalizer -verify-machineinstrs -simplify-mir <INPUT>.mir -o -

with the following output:

  --- |
    ; ModuleID = 'out.mir'
    source_filename = "out.mir"
    target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
    target triple = "aarch64--"
    
    define i64 @broken(<4 x i16> %v) {
      %res = bitcast <4 x i16> %v to i64
      ret i64 %res
    }
  
  ...
  ---
  name:            broken
  alignment:       2
  legalized:       true
  tracksRegLiveness: true
  registers:       
    - { id: 0, class: _ }
    - { id: 1, class: _ }
  frameInfo:       
    maxCallFrameSize: 0
  body:             |
    bb.0 (%ir-block.0):
      liveins: $d0
    
      %0:_(<4 x s16>) = COPY $d0
      %1:_(s64) = G_INTTOPTR %0(<4 x s16>)
      $x0 = COPY %1(s64)
      RET_ReallyLR implicit $x0
  
  ...


Repository:
  rL LLVM

https://reviews.llvm.org/D44704





More information about the llvm-commits mailing list