Skip to content

Commit 4dcec18

Browse files
committed
[GlobalISel] Combine (sext (trunc x)) to (sext_inreg x)
Split from llvm#131312
1 parent 0878dd1 commit 4dcec18

File tree

3 files changed

+132
-1
lines changed

3 files changed

+132
-1
lines changed

llvm/include/llvm/Target/GlobalISel/Combine.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1522,7 +1522,7 @@ def extract_vector_element_build_vector_trunc8 : GICombineRule<
15221522

15231523
def sext_trunc : GICombineRule<
15241524
(defs root:$root, build_fn_matchinfo:$matchinfo),
1525-
(match (G_TRUNC $src, $x, (MIFlags NoSWrap)),
1525+
(match (G_TRUNC $src, $x),
15261526
(G_SEXT $root, $src),
15271527
[{ return Helper.matchSextOfTrunc(${root}, ${matchinfo}); }]),
15281528
(apply [{ Helper.applyBuildFnMO(${root}, ${matchinfo}); }])>;

llvm/lib/CodeGen/GlobalISel/CombinerHelperCasts.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ bool CombinerHelper::matchSextOfTrunc(const MachineOperand &MO,
3636
LLT DstTy = MRI.getType(Dst);
3737
LLT SrcTy = MRI.getType(Src);
3838

39+
// Combines without nsw trunc.
40+
if (!(Trunc->getFlags() & MachineInstr::NoSWrap)) {
41+
if (DstTy != SrcTy)
42+
return false;
43+
44+
unsigned TruncWidth = MRI.getType(Trunc->getReg(0)).getScalarSizeInBits();
45+
MatchInfo = [=](MachineIRBuilder &B) {
46+
B.buildSExtInReg(Dst, Src, TruncWidth);
47+
};
48+
return true;
49+
}
50+
51+
// Combines for nsw trunc.
52+
3953
if (DstTy == SrcTy) {
4054
MatchInfo = [=](MachineIRBuilder &B) { B.buildCopy(Dst, Src); };
4155
return true;
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
3+
4+
---
5+
name: trunc_sext_i32_i16
6+
tracksRegLiveness: true
7+
body: |
8+
bb.0:
9+
liveins: $vgpr0
10+
11+
; GCN-LABEL: name: trunc_sext_i32_i16
12+
; GCN: liveins: $vgpr0
13+
; GCN-NEXT: {{ $}}
14+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
15+
; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[COPY]], 16
16+
; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
17+
%0:_(s32) = COPY $vgpr0
18+
%1:_(s16) = G_TRUNC %0
19+
%2:_(s32) = G_SEXT %1
20+
$vgpr0 = COPY %2
21+
...
22+
23+
---
24+
name: trunc_sext_i32_i8
25+
tracksRegLiveness: true
26+
body: |
27+
bb.0:
28+
liveins: $vgpr0
29+
30+
; GCN-LABEL: name: trunc_sext_i32_i8
31+
; GCN: liveins: $vgpr0
32+
; GCN-NEXT: {{ $}}
33+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
34+
; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[COPY]], 8
35+
; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
36+
%0:_(s32) = COPY $vgpr0
37+
%1:_(s8) = G_TRUNC %0
38+
%2:_(s32) = G_SEXT %1
39+
$vgpr0 = COPY %2
40+
...
41+
42+
---
43+
name: trunc_sext_i64_i32
44+
tracksRegLiveness: true
45+
body: |
46+
bb.0:
47+
liveins: $vgpr0_vgpr1
48+
49+
; GCN-LABEL: name: trunc_sext_i64_i32
50+
; GCN: liveins: $vgpr0_vgpr1
51+
; GCN-NEXT: {{ $}}
52+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
53+
; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
54+
; GCN-NEXT: $vgpr0_vgpr1 = COPY [[SEXT_INREG]](s64)
55+
%0:_(s64) = COPY $vgpr0_vgpr1
56+
%1:_(s32) = G_TRUNC %0
57+
%2:_(s64) = G_SEXT %1
58+
$vgpr0_vgpr1 = COPY %2
59+
...
60+
61+
---
62+
name: trunc_sext_v4i32_v4i16
63+
tracksRegLiveness: true
64+
body: |
65+
bb.0:
66+
liveins: $vgpr0_vgpr1_vgpr2_vgpr3
67+
68+
; GCN-LABEL: name: trunc_sext_v4i32_v4i16
69+
; GCN: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
70+
; GCN-NEXT: {{ $}}
71+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
72+
; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(<4 x s32>) = G_SEXT_INREG [[COPY]], 16
73+
; GCN-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[SEXT_INREG]](<4 x s32>)
74+
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
75+
%1:_(<4 x s16>) = G_TRUNC %0
76+
%2:_(<4 x s32>) = G_SEXT %1
77+
$vgpr0_vgpr1_vgpr2_vgpr3 = COPY %2
78+
...
79+
80+
---
81+
name: trunc_sext_v4i16_v4i8
82+
tracksRegLiveness: true
83+
body: |
84+
bb.0:
85+
liveins: $vgpr0_vgpr1
86+
87+
; GCN-LABEL: name: trunc_sext_v4i16_v4i8
88+
; GCN: liveins: $vgpr0_vgpr1
89+
; GCN-NEXT: {{ $}}
90+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
91+
; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(<4 x s16>) = G_SEXT_INREG [[COPY]], 8
92+
; GCN-NEXT: $vgpr0_vgpr1 = COPY [[SEXT_INREG]](<4 x s16>)
93+
%0:_(<4 x s16>) = COPY $vgpr0_vgpr1
94+
%1:_(<4 x s8>) = G_TRUNC %0
95+
%2:_(<4 x s16>) = G_SEXT %1
96+
$vgpr0_vgpr1 = COPY %2
97+
...
98+
99+
---
100+
name: trunc_sext_mismatching_types
101+
tracksRegLiveness: true
102+
body: |
103+
bb.0:
104+
liveins: $vgpr0_vgpr1
105+
106+
; GCN-LABEL: name: trunc_sext_mismatching_types
107+
; GCN: liveins: $vgpr0_vgpr1
108+
; GCN-NEXT: {{ $}}
109+
; GCN-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
110+
; GCN-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s64)
111+
; GCN-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[TRUNC]](s16)
112+
; GCN-NEXT: $vgpr0 = COPY [[SEXT]](s32)
113+
%0:_(s64) = COPY $vgpr0_vgpr1
114+
%1:_(s16) = G_TRUNC %0
115+
%2:_(s32) = G_SEXT %1
116+
$vgpr0 = COPY %2
117+
...

0 commit comments

Comments
 (0)