Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Reland [GlobalISel] Combine zext(trunc x) to x
Recommit 4112299. Depends on 4c8fb7d which was reverted. Combine zext(trunc x) to x when truncated bits are known to be zero. Differential Revision: https://reviews.llvm.org/D96031
- Loading branch information
1 parent
fec0a0a
commit d44f61f
Showing
5 changed files
with
230 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
198 changes: 198 additions & 0 deletions
198
llvm/test/CodeGen/AMDGPU/GlobalISel/combine-zext-trunc.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py | ||
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s | ||
|
||
--- | ||
name: zext_trunc_s32_s16_s32 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0 | ||
; GCN-LABEL: name: zext_trunc_s32_s16_s32 | ||
; GCN: liveins: $vgpr0 | ||
; GCN: %var:_(s32) = COPY $vgpr0 | ||
; GCN: %c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
; GCN: %low_bits:_(s32) = G_AND %var, %c3FFF | ||
; GCN: $vgpr0 = COPY %low_bits(s32) | ||
%var:_(s32) = COPY $vgpr0 | ||
%c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
%low_bits:_(s32) = G_AND %var, %c3FFF | ||
%trunc:_(s16) = G_TRUNC %low_bits(s32) | ||
%zext:_(s32) = G_ZEXT %trunc(s16) | ||
$vgpr0 = COPY %zext(s32) | ||
... | ||
|
||
--- | ||
name: zext_trunc_s32_s16_s32_unknown_high_bits | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0 | ||
; GCN-LABEL: name: zext_trunc_s32_s16_s32_unknown_high_bits | ||
; GCN: liveins: $vgpr0 | ||
; GCN: %var:_(s32) = COPY $vgpr0 | ||
; GCN: %cFFFFF:_(s32) = G_CONSTANT i32 1048575 | ||
; GCN: %low_bits:_(s32) = G_AND %var, %cFFFFF | ||
; GCN: %trunc:_(s16) = G_TRUNC %low_bits(s32) | ||
; GCN: %zext:_(s32) = G_ZEXT %trunc(s16) | ||
; GCN: $vgpr0 = COPY %zext(s32) | ||
%var:_(s32) = COPY $vgpr0 | ||
%cFFFFF:_(s32) = G_CONSTANT i32 1048575 | ||
%low_bits:_(s32) = G_AND %var, %cFFFFF | ||
%trunc:_(s16) = G_TRUNC %low_bits(s32) | ||
%zext:_(s32) = G_ZEXT %trunc(s16) | ||
$vgpr0 = COPY %zext(s32) | ||
... | ||
|
||
--- | ||
name: zext_trunc_s64_s16_s32 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0_vgpr1 | ||
; GCN-LABEL: name: zext_trunc_s64_s16_s32 | ||
; GCN: liveins: $vgpr0_vgpr1 | ||
; GCN: %var:_(s64) = COPY $vgpr0_vgpr1 | ||
; GCN: %c3FFF:_(s64) = G_CONSTANT i64 16383 | ||
; GCN: %low_bits:_(s64) = G_AND %var, %c3FFF | ||
; GCN: %trunc:_(s16) = G_TRUNC %low_bits(s64) | ||
; GCN: %zext:_(s32) = G_ZEXT %trunc(s16) | ||
; GCN: $vgpr0 = COPY %zext(s32) | ||
%var:_(s64) = COPY $vgpr0_vgpr1 | ||
%c3FFF:_(s64) = G_CONSTANT i64 16383 | ||
%low_bits:_(s64) = G_AND %var, %c3FFF | ||
%trunc:_(s16) = G_TRUNC %low_bits(s64) | ||
%zext:_(s32) = G_ZEXT %trunc(s16) | ||
$vgpr0 = COPY %zext(s32) | ||
... | ||
|
||
--- | ||
name: zext_trunc_s32_s16_s64 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0 | ||
; GCN-LABEL: name: zext_trunc_s32_s16_s64 | ||
; GCN: liveins: $vgpr0 | ||
; GCN: %var:_(s32) = COPY $vgpr0 | ||
; GCN: %c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
; GCN: %low_bits:_(s32) = G_AND %var, %c3FFF | ||
; GCN: %trunc:_(s16) = G_TRUNC %low_bits(s32) | ||
; GCN: %zext:_(s64) = G_ZEXT %trunc(s16) | ||
; GCN: $vgpr0_vgpr1 = COPY %zext(s64) | ||
%var:_(s32) = COPY $vgpr0 | ||
%c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
%low_bits:_(s32) = G_AND %var, %c3FFF | ||
%trunc:_(s16) = G_TRUNC %low_bits(s32) | ||
%zext:_(s64) = G_ZEXT %trunc(s16) | ||
$vgpr0_vgpr1 = COPY %zext(s64) | ||
... | ||
|
||
--- | ||
name: zext_trunc_v2s32_v2s16_v2s32 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0_vgpr1 | ||
; GCN-LABEL: name: zext_trunc_v2s32_v2s16_v2s32 | ||
; GCN: liveins: $vgpr0_vgpr1 | ||
; GCN: %var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
; GCN: %c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
; GCN: %c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
; GCN: %c:_(<2 x s32>) = G_BUILD_VECTOR %c3FFF(s32), %c7FFF(s32) | ||
; GCN: %low_bits:_(<2 x s32>) = G_AND %var, %c | ||
; GCN: $vgpr0_vgpr1 = COPY %low_bits(<2 x s32>) | ||
%var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
%c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
%c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
%c:_(<2 x s32>) = G_BUILD_VECTOR %c3FFF(s32), %c7FFF(s32) | ||
%low_bits:_(<2 x s32>) = G_AND %var, %c | ||
%trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s32>) | ||
%zext:_(<2 x s32>) = G_ZEXT %trunc(<2 x s16>) | ||
$vgpr0_vgpr1 = COPY %zext(<2 x s32>) | ||
... | ||
|
||
--- | ||
name: zext_trunc_v2s32_v2s16_v2s32_unknown_high_bits | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0_vgpr1 | ||
; GCN-LABEL: name: zext_trunc_v2s32_v2s16_v2s32_unknown_high_bits | ||
; GCN: liveins: $vgpr0_vgpr1 | ||
; GCN: %var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
; GCN: %cFFFFF:_(s32) = G_CONSTANT i32 1048575 | ||
; GCN: %c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
; GCN: %c:_(<2 x s32>) = G_BUILD_VECTOR %cFFFFF(s32), %c7FFF(s32) | ||
; GCN: %low_bits:_(<2 x s32>) = G_AND %var, %c | ||
; GCN: %trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s32>) | ||
; GCN: %zext:_(<2 x s32>) = G_ZEXT %trunc(<2 x s16>) | ||
; GCN: $vgpr0_vgpr1 = COPY %zext(<2 x s32>) | ||
%var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
%cFFFFF:_(s32) = G_CONSTANT i32 1048575 | ||
%c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
%c:_(<2 x s32>) = G_BUILD_VECTOR %cFFFFF(s32), %c7FFF(s32) | ||
%low_bits:_(<2 x s32>) = G_AND %var, %c | ||
%trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s32>) | ||
%zext:_(<2 x s32>) = G_ZEXT %trunc(<2 x s16>) | ||
$vgpr0_vgpr1 = COPY %zext(<2 x s32>) | ||
... | ||
|
||
--- | ||
name: zext_trunc_v2s64_v2s16_v2s32 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0_vgpr1_vgpr2_vgpr3 | ||
; GCN-LABEL: name: zext_trunc_v2s64_v2s16_v2s32 | ||
; GCN: liveins: $vgpr0_vgpr1_vgpr2_vgpr3 | ||
; GCN: %var:_(<2 x s64>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 | ||
; GCN: %c3FFF:_(s64) = G_CONSTANT i64 16383 | ||
; GCN: %c7FFF:_(s64) = G_CONSTANT i64 32767 | ||
; GCN: %c:_(<2 x s64>) = G_BUILD_VECTOR %c3FFF(s64), %c7FFF(s64) | ||
; GCN: %low_bits:_(<2 x s64>) = G_AND %var, %c | ||
; GCN: %trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s64>) | ||
; GCN: %zext:_(<2 x s32>) = G_ZEXT %trunc(<2 x s16>) | ||
; GCN: $vgpr0_vgpr1 = COPY %zext(<2 x s32>) | ||
%var:_(<2 x s64>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 | ||
%c3FFF:_(s64) = G_CONSTANT i64 16383 | ||
%c7FFF:_(s64) = G_CONSTANT i64 32767 | ||
%c:_(<2 x s64>) = G_BUILD_VECTOR %c3FFF(s64), %c7FFF(s64) | ||
%low_bits:_(<2 x s64>) = G_AND %var, %c | ||
%trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s64>) | ||
%zext:_(<2 x s32>) = G_ZEXT %trunc(<2 x s16>) | ||
$vgpr0_vgpr1 = COPY %zext(<2 x s32>) | ||
... | ||
|
||
--- | ||
name: zext_trunc_v2s32_v2s16_v2s64 | ||
tracksRegLiveness: true | ||
body: | | ||
bb.0: | ||
liveins: $vgpr0_vgpr1 | ||
; GCN-LABEL: name: zext_trunc_v2s32_v2s16_v2s64 | ||
; GCN: liveins: $vgpr0_vgpr1 | ||
; GCN: %var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
; GCN: %c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
; GCN: %c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
; GCN: %c:_(<2 x s32>) = G_BUILD_VECTOR %c3FFF(s32), %c7FFF(s32) | ||
; GCN: %low_bits:_(<2 x s32>) = G_AND %var, %c | ||
; GCN: %trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s32>) | ||
; GCN: %zext:_(<2 x s64>) = G_ZEXT %trunc(<2 x s16>) | ||
; GCN: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %zext(<2 x s64>) | ||
%var:_(<2 x s32>) = COPY $vgpr0_vgpr1 | ||
%c3FFF:_(s32) = G_CONSTANT i32 16383 | ||
%c7FFF:_(s32) = G_CONSTANT i32 32767 | ||
%c:_(<2 x s32>) = G_BUILD_VECTOR %c3FFF(s32), %c7FFF(s32) | ||
%low_bits:_(<2 x s32>) = G_AND %var, %c | ||
%trunc:_(<2 x s16>) = G_TRUNC %low_bits(<2 x s32>) | ||
%zext:_(<2 x s64>) = G_ZEXT %trunc(<2 x s16>) | ||
$vgpr0_vgpr1_vgpr2_vgpr3 = COPY %zext(<2 x s64>) | ||
... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters