]> granicus.if.org Git - llvm/commitdiff
AMDGPU/GlobalISel: Fix non-power-of-2 G_EXTRACT sources
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 22 Apr 2019 15:22:46 +0000 (15:22 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 22 Apr 2019 15:22:46 +0000 (15:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358894 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
test/CodeGen/AMDGPU/GlobalISel/legalize-extract.mir

index 79499a4f3f6a1b7cf8e7476b01acace60f78aa35..b9ffb451bcb69c01bc99dda80ce25aa7f37c4aff 100644 (file)
@@ -561,7 +561,9 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST,
           return (LitTy.getScalarSizeInBits() < 16);
         },
         LegalizeMutations::widenScalarOrEltToNextPow2(LitTyIdx, 16))
-      .moreElementsIf(isSmallOddVector(BigTyIdx), oneMoreElement(BigTyIdx));
+      .moreElementsIf(isSmallOddVector(BigTyIdx), oneMoreElement(BigTyIdx))
+      .widenScalarToNextPow2(BigTyIdx, 32);
+
   }
 
   // TODO: vectors of pointers
index 371cf76d9573fe85d7c58e597e82ab27e458e2db..2316a7cd1f07c65a9642769dc0093b6ad697b4ef 100644 (file)
@@ -29,6 +29,60 @@ body: |
     %1:_(s32) = G_EXTRACT %0, 32
      $vgpr0 = COPY %1
 ...
+
+---
+name: test_extract_s8_s15_offset0
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: test_extract_s8_s15_offset0
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
+    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
+    %0:_(s64) = COPY $vgpr0_vgpr1
+    %1:_(s31) = G_TRUNC %0
+    %2:_(s8) = G_EXTRACT %1, 0
+    %3:_(s32) = G_ANYEXT %2
+    $vgpr0 = COPY %3
+...
+
+---
+name: test_extract_s16_s31_offset0
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: test_extract_s16_s31_offset0
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
+    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
+    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[TRUNC]](s32), 0
+    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
+    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
+    %0:_(s64) = COPY $vgpr0_vgpr1
+    %1:_(s31) = G_TRUNC %0
+    %2:_(s16) = G_EXTRACT %1, 0
+    %3:_(s32) = G_ANYEXT %2
+    $vgpr0 = COPY %3
+...
+
+---
+name: test_extract_s32_s48_offset0
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: test_extract_s32_s48_offset0
+    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
+    ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)
+    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY1]](s64), 0
+    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
+    %0:_(s64) = COPY $vgpr0_vgpr1
+    %1:_(s48) = G_TRUNC %0
+    %2:_(s32) = G_EXTRACT %1, 0
+    $vgpr0 = COPY %2
+...
+
 ---
 name: test_extract_s32_s96_offset0
 body: |