[llvm] 3649837 - [AArch64][GlobalISel] Widen G_BSWAP before clamping

Jessica Paquette via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 5 15:17:01 PDT 2021


Author: Jessica Paquette
Date: 2021-08-05T15:16:00-07:00
New Revision: 36498374d471272ab094b622dbc55874d8713a8f

URL: https://github.com/llvm/llvm-project/commit/36498374d471272ab094b622dbc55874d8713a8f
DIFF: https://github.com/llvm/llvm-project/commit/36498374d471272ab094b622dbc55874d8713a8f.diff

LOG: [AArch64][GlobalISel] Widen G_BSWAP before clamping

This allows us to avoid odd type breakdowns + allows us to legalize types like
s88 in the first place.

Add some testcases for known legal types + testcases for s4 and s88.

Differential Revision: https://reviews.llvm.org/D107607

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
    llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 99b43c87cf62..0a13e21c1c03 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -109,8 +109,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
 
   getActionDefinitionsBuilder(G_BSWAP)
       .legalFor({s32, s64, v4s32, v2s32, v2s64})
-      .clampScalar(0, s32, s64)
       .widenScalarToNextPow2(0)
+      .clampScalar(0, s32, s64)
       .customIf(typeIs(0, v2s16)); // custom lower as G_REV32 + G_LSHR
 
   getActionDefinitionsBuilder({G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR})

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
index 6ffed0a20600..fd2f013542c3 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-bswap.mir
@@ -1,27 +1,10 @@
 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
 # RUN: llc -march=aarch64 -run-pass=legalizer %s -o - -verify-machineinstrs | FileCheck %s
---- |
-  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
-  target triple = "aarch64"
-
-  declare i16 @llvm.bswap.i16(i16) #0
-
-  define i16 @bswap_s16(i16 %a) { ret i16 0 }
-
-  define <2 x i16> @bswap_2xi16(<2 x i16> %a) { ret <2 x i16> <i16 0, i16 0> }
-
-  attributes #0 = { nounwind readnone speculatable willreturn }
 
 ...
 ---
 name:            bswap_s16
-alignment:       4
 tracksRegLiveness: true
-liveins:
-  - { reg: '$w0' }
-frameInfo:
-  maxAlignment:    1
-machineFunctionInfo: {}
 body:             |
   bb.1:
     liveins: $w0
@@ -42,20 +25,10 @@ body:             |
     %3:_(s32) = G_ANYEXT %2(s16)
     $w0 = COPY %3(s32)
     RET_ReallyLR implicit $w0
-
 ...
 ---
 name:            bswap_2xi16
-alignment:       4
 tracksRegLiveness: true
-registers:
-  - { id: 0, class: _ }
-  - { id: 1, class: _ }
-liveins:
-  - { reg: '$s0' }
-frameInfo:
-  maxAlignment:    1
-machineFunctionInfo: {}
 body:             |
   bb.1:
     liveins: $s0
@@ -79,5 +52,147 @@ body:             |
     %1:_(<2 x s16>) = G_BSWAP %0
     $s0 = COPY %1(<2 x s16>)
     RET_ReallyLR
-
 ...
+---
+name:            bswap_s32_legal
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $w0
+    ; CHECK-LABEL: name: bswap_s32_legal
+    ; CHECK: liveins: $w0
+    ; CHECK: %copy:_(s32) = COPY $w0
+    ; CHECK: %bswap:_(s32) = G_BSWAP %copy
+    ; CHECK: $w0 = COPY %bswap(s32)
+    ; CHECK: RET_ReallyLR implicit $w0
+    %copy:_(s32) = COPY $w0
+    %bswap:_(s32) = G_BSWAP %copy
+    $w0 = COPY %bswap(s32)
+    RET_ReallyLR implicit $w0
+...
+---
+name:            bswap_s64_legal
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: bswap_s64_legal
+    ; CHECK: liveins: $x0
+    ; CHECK: %copy:_(s64) = COPY $x0
+    ; CHECK: %bswap:_(s64) = G_BSWAP %copy
+    ; CHECK: $x0 = COPY %bswap(s64)
+    ; CHECK: RET_ReallyLR implicit $x0
+    %copy:_(s64) = COPY $x0
+    %bswap:_(s64) = G_BSWAP %copy
+    $x0 = COPY %bswap(s64)
+    RET_ReallyLR implicit $x0
+...
+---
+name:            bswap_v4s32_legal
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $q0
+    ; CHECK-LABEL: name: bswap_v4s32_legal
+    ; CHECK: liveins: $q0
+    ; CHECK: %copy:_(<4 x s32>) = COPY $q0
+    ; CHECK: %bswap:_(<4 x s32>) = G_BSWAP %copy
+    ; CHECK: $q0 = COPY %bswap(<4 x s32>)
+    ; CHECK: RET_ReallyLR implicit $q0
+    %copy:_(<4 x s32>) = COPY $q0
+    %bswap:_(<4 x s32>) = G_BSWAP %copy
+    $q0 = COPY %bswap(<4 x s32>)
+    RET_ReallyLR implicit $q0
+...
+---
+name:            bswap_v2s32_legal
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $d0
+    ; CHECK-LABEL: name: bswap_v2s32_legal
+    ; CHECK: liveins: $d0
+    ; CHECK: %copy:_(<2 x s32>) = COPY $d0
+    ; CHECK: %bswap:_(<2 x s32>) = G_BSWAP %copy
+    ; CHECK: $d0 = COPY %bswap(<2 x s32>)
+    ; CHECK: RET_ReallyLR implicit $d0
+    %copy:_(<2 x s32>) = COPY $d0
+    %bswap:_(<2 x s32>) = G_BSWAP %copy
+    $d0 = COPY %bswap(<2 x s32>)
+    RET_ReallyLR implicit $d0
+...
+---
+name:            bswap_v2s64_legal
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $q0
+    ; CHECK-LABEL: name: bswap_v2s64_legal
+    ; CHECK: liveins: $q0
+    ; CHECK: %copy:_(<2 x s64>) = COPY $q0
+    ; CHECK: %bswap:_(<2 x s64>) = G_BSWAP %copy
+    ; CHECK: $q0 = COPY %bswap(<2 x s64>)
+    ; CHECK: RET_ReallyLR implicit $q0
+    %copy:_(<2 x s64>) = COPY $q0
+    %bswap:_(<2 x s64>) = G_BSWAP %copy
+    $q0 = COPY %bswap(<2 x s64>)
+    RET_ReallyLR implicit $q0
+...
+---
+name:            bswap_s88
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: bswap_s88
+    ; CHECK: liveins: $x0
+    ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
+    ; CHECK: [[BSWAP:%[0-9]+]]:_(s64) = G_BSWAP [[DEF]]
+    ; CHECK: [[BSWAP1:%[0-9]+]]:_(s64) = G_BSWAP [[DEF]]
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 40
+    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
+    ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 64
+    ; CHECK: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[C2]]
+    ; CHECK: [[SUB1:%[0-9]+]]:_(s64) = G_SUB [[C2]], [[C]]
+    ; CHECK: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[C]](s64), [[C2]]
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP]](s32)
+    ; CHECK: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[C]](s64), [[C1]]
+    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s1) = G_TRUNC [[ICMP1]](s32)
+    ; CHECK: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[BSWAP1]], [[C]](s64)
+    ; CHECK: [[LSHR1:%[0-9]+]]:_(s64) = G_LSHR [[BSWAP]], [[C]](s64)
+    ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[BSWAP1]], [[SUB1]](s64)
+    ; CHECK: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR1]], [[SHL]]
+    ; CHECK: [[LSHR2:%[0-9]+]]:_(s64) = G_LSHR [[BSWAP1]], [[SUB]](s64)
+    ; CHECK: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC]](s1), [[OR]], [[LSHR2]]
+    ; CHECK: [[SELECT1:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC1]](s1), [[BSWAP]], [[SELECT]]
+    ; CHECK: [[SELECT2:%[0-9]+]]:_(s64) = G_SELECT [[TRUNC]](s1), [[LSHR]], [[C1]]
+    ; CHECK: $x0 = COPY [[SELECT1]](s64)
+    ; CHECK: RET_ReallyLR implicit $x0
+    %val:_(s88) = G_IMPLICIT_DEF
+    %bswap:_(s88) = G_BSWAP %val
+    %trunc:_(s64) = G_TRUNC %bswap
+    $x0 = COPY %trunc(s64)
+    RET_ReallyLR implicit $x0
+...
+---
+name:            bswap_s4
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: bswap_s4
+    ; CHECK: liveins: $x0
+    ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
+    ; CHECK: [[BSWAP:%[0-9]+]]:_(s32) = G_BSWAP [[DEF]]
+    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 28
+    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BSWAP]], [[C]](s64)
+    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 15
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[LSHR]](s32)
+    ; CHECK: %ext:_(s64) = G_AND [[ANYEXT]], [[C1]]
+    ; CHECK: $x0 = COPY %ext(s64)
+    ; CHECK: RET_ReallyLR implicit $x0
+    %val:_(s4) = G_IMPLICIT_DEF
+    %bswap:_(s4) = G_BSWAP %val
+    %ext:_(s64) = G_ZEXT %bswap
+    $x0 = COPY %ext(s64)
+    RET_ReallyLR implicit $x0


        


More information about the llvm-commits mailing list