OSDN Git Service

[AArch64][LegalizerInfo] Mark s128 G_BITCAST legal
authorQuentin Colombet <qcolombet@apple.com>
Mon, 16 Oct 2017 22:28:27 +0000 (22:28 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Mon, 16 Oct 2017 22:28:27 +0000 (22:28 +0000)
We used to mark all G_BITCAST of 128-bit legal but only for vector
types. Scalars of this size are just fine as well.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315945 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64LegalizerInfo.cpp
test/CodeGen/AArch64/GlobalISel/legalize-simple.mir

index 0fdd0ba..2d45be3 100644 (file)
@@ -31,6 +31,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo() {
   const LLT s16 = LLT::scalar(16);
   const LLT s32 = LLT::scalar(32);
   const LLT s64 = LLT::scalar(64);
+  const LLT s128 = LLT::scalar(128);
   const LLT v2s32 = LLT::vector(2, 32);
   const LLT v4s32 = LLT::vector(4, 32);
   const LLT v2s64 = LLT::vector(2, 64);
@@ -229,7 +230,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo() {
   setAction({G_INTTOPTR, 1, s64}, Legal);
 
   // Casts for 32 and 64-bit width type are just copies.
-  for (auto Ty : {s1, s8, s16, s32, s64}) {
+  // Same for 128-bit width type, except they are on the FPR bank.
+  for (auto Ty : {s1, s8, s16, s32, s64, s128}) {
     setAction({G_BITCAST, 0, Ty}, Legal);
     setAction({G_BITCAST, 1, Ty}, Legal);
   }
index d2a02a3..495ea6c 100644 (file)
@@ -9,6 +9,9 @@
   next:
     ret void
   }
+  define void @bitcast128() {
+    ret void
+  }
 ...
 
 ---
@@ -84,3 +87,26 @@ body: |
     %15(<4 x s8>) = G_BITCAST %0
     %16(<2 x s16>) = G_BITCAST %0
 ...
+
+---
+name:            bitcast128
+tracksRegLiveness: true
+registers:
+  - { id: 0, class: _}
+  - { id: 1, class: _}
+  - { id: 2, class: _}
+  - { id: 3, class: _}
+body:             |
+  bb.1:
+    liveins: %x0, %x1
+    ; CHECK-LABEL: bitcast128
+    ; This is legal and shouldn't be changed.
+    ; CHECK: %2(<2 x s64>) = G_BITCAST %3(s128)
+    %0(s64) = COPY %x0
+    %1(s64) = COPY %x1
+    %3(s128) = G_MERGE_VALUES %0(s64), %1(s64)
+    %2(<2 x s64>) = G_BITCAST %3(s128)
+    %q0 = COPY %2(<2 x s64>)
+    RET_ReallyLR implicit %q0
+
+...