Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[GlobalISel] combine G_TRUNC with G_MERGE_VALUES
Summary: Truncating the result of a merge means that most likely we could have done without merge in the first place and just used the input merge inputs directly. This can be done in three cases: 1. If the truncation result is smaller than the merge source, we can use the source in the trunc directly 2. If the sizes are the same, we can replace the register or use a copy 3. If the truncation size is a multiple of the merge source size, we can build a smaller merge This gets rid of most of the larger, hard-to-legalize merges. Reviewers: qcolombet, aditya_nandakumar, aemerson, paquette, arsenm, Petar.Avramovic Reviewed By: arsenm Subscribers: sdardis, jvesely, wdng, nhaehnle, rovka, jrtc27, atanasyan, kerbowa, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D75915
- Loading branch information
Showing
15 changed files
with
1,156 additions
and
1,154 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
136 changes: 136 additions & 0 deletions
136
llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-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,136 @@ | ||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py | ||
# RUN: llc -O0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -run-pass=legalizer %s -o - | FileCheck %s | ||
|
||
--- | ||
name: trunc_s16_merge_s64_s32 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with trunc-size < merge-source-size creates a trunc | ||
; of the merge source | ||
; CHECK-LABEL: name: trunc_s16_merge_s64_s32 | ||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 | ||
; CHECK: $vgpr0 = COPY [[C]](s32) | ||
%0:_(s32) = G_CONSTANT i32 0 | ||
%1:_(s32) = G_CONSTANT i32 1 | ||
%2:_(s64) = G_MERGE_VALUES %0, %1 | ||
%3:_(s16) = G_TRUNC %2 | ||
%4:_(s32) = G_ANYEXT %3 | ||
$vgpr0 = COPY %4 | ||
... | ||
|
||
--- | ||
name: trunc_s32_merge_s64_s32 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with trunc-size == merge-source-size is eliminated | ||
; CHECK-LABEL: name: trunc_s32_merge_s64_s32 | ||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 | ||
; CHECK: $vgpr0 = COPY [[C]](s32) | ||
%0:_(s32) = G_CONSTANT i32 0 | ||
%1:_(s32) = G_CONSTANT i32 1 | ||
%2:_(s64) = G_MERGE_VALUES %0, %1 | ||
%3:_(s32) = G_TRUNC %2 | ||
$vgpr0 = COPY %3 | ||
... | ||
|
||
--- | ||
name: trunc_s64_merge_s128_s32 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with trunc-size > merge-source-size combines to a | ||
; smaller merge | ||
; CHECK-LABEL: name: trunc_s64_merge_s128_s32 | ||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 | ||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C]](s32), [[C1]](s32) | ||
; CHECK: $vgpr0_vgpr1 = COPY [[MV]](s64) | ||
%0:_(s32) = G_CONSTANT i32 0 | ||
%1:_(s32) = G_CONSTANT i32 1 | ||
%2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1 | ||
%3:_(s64) = G_TRUNC %2 | ||
$vgpr0_vgpr1 = COPY %3 | ||
... | ||
|
||
--- | ||
name: trunc_s32_merge_s128_p0 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with a non-scalar merge source is not combined | ||
; CHECK-LABEL: name: trunc_s32_merge_s128_p0 | ||
; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 | ||
; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0) | ||
; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[MV]](s128) | ||
; CHECK: $vgpr0 = COPY [[TRUNC]](s32) | ||
%0:_(p0) = G_CONSTANT i64 0 | ||
%1:_(p0) = G_CONSTANT i64 1 | ||
%2:_(s128) = G_MERGE_VALUES %0, %1 | ||
%3:_(s32) = G_TRUNC %2 | ||
$vgpr0 = COPY %3 | ||
... | ||
|
||
--- | ||
name: trunc_s64_merge_s128_p0 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with a non-scalar merge source is not combined | ||
; CHECK-LABEL: name: trunc_s64_merge_s128_p0 | ||
; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 | ||
; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0) | ||
; CHECK: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[MV]](s128) | ||
; CHECK: $vgpr0_vgpr1 = COPY [[TRUNC]](s64) | ||
%0:_(p0) = G_CONSTANT i64 0 | ||
%1:_(p0) = G_CONSTANT i64 1 | ||
%2:_(s128) = G_MERGE_VALUES %0, %1 | ||
%3:_(s64) = G_TRUNC %2 | ||
$vgpr0_vgpr1 = COPY %3 | ||
... | ||
|
||
--- | ||
name: trunc_s128_merge_s192_p0 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with a non-scalar merge source is not combined | ||
; CHECK-LABEL: name: trunc_s128_merge_s192_p0 | ||
; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 | ||
; CHECK: [[MV:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[C]](p0), [[C1]](p0), [[C]](p0) | ||
; CHECK: [[TRUNC:%[0-9]+]]:_(s128) = G_TRUNC [[MV]](s192) | ||
; CHECK: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[TRUNC]](s128) | ||
%0:_(p0) = G_CONSTANT i64 0 | ||
%1:_(p0) = G_CONSTANT i64 1 | ||
%2:_(s192) = G_MERGE_VALUES %0, %1, %0 | ||
%3:_(s128) = G_TRUNC %2 | ||
$vgpr0_vgpr1_vgpr2_vgpr3 = COPY %3 | ||
... | ||
|
||
--- | ||
name: trunc_s68_merge_s128_s32 | ||
|
||
body: | | ||
bb.0: | ||
; Test that trunc(merge) with trunc-size > merge-source-size is not combined | ||
; if trunc-size % merge-source-size != 0 | ||
; CHECK-LABEL: name: trunc_s68_merge_s128_s32 | ||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 | ||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 | ||
; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](s32), [[C1]](s32), [[C]](s32), [[C1]](s32) | ||
; CHECK: [[TRUNC:%[0-9]+]]:_(s68) = G_TRUNC [[MV]](s128) | ||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[TRUNC]](s68) | ||
; CHECK: $vgpr0 = COPY [[TRUNC1]](s32) | ||
%0:_(s32) = G_CONSTANT i32 0 | ||
%1:_(s32) = G_CONSTANT i32 1 | ||
%2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1 | ||
%3:_(s68) = G_TRUNC %2 | ||
%4:_(s32) = G_TRUNC %3 | ||
$vgpr0 = COPY %4 | ||
... |
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
Oops, something went wrong.