Skip to content

Commit 0e826f0

Browse files
committed
Refactored, added MIR test.
1 parent 6b37a65 commit 0e826f0

File tree

2 files changed

+162
-10
lines changed

2 files changed

+162
-10
lines changed

llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,18 +1071,18 @@ void applyVectorSextInReg(MachineInstr &MI, MachineRegisterInfo &MRI,
10711071
bool matchUnmergeExtToUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
10721072
Register &MatchInfo) {
10731073
assert(MI.getOpcode() == TargetOpcode::G_UNMERGE_VALUES);
1074-
if (MI.getNumDefs() != 2)
1074+
auto &Unmerge = cast<GUnmerge>(MI);
1075+
if (Unmerge.getNumDefs() != 2)
10751076
return false;
1076-
if (!MRI.use_nodbg_empty(MI.getOperand(1).getReg()))
1077+
if (!MRI.use_nodbg_empty(Unmerge.getOperand(1).getReg()))
10771078
return false;
10781079

1079-
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
1080+
LLT DstTy = MRI.getType(Unmerge.getOperand(0).getReg());
10801081
if (!DstTy.isVector())
10811082
return false;
10821083

1083-
MachineInstr *Ext = getDefIgnoringCopies(
1084-
MI.getOperand(MI.getNumExplicitDefs()).getReg(), MRI);
1085-
if (!Ext || Ext->getOpcode() != AArch64::G_EXT)
1084+
MachineInstr *Ext = getOpcodeDef(AArch64::G_EXT, Unmerge.getSourceReg(), MRI);
1085+
if (!Ext)
10861086
return false;
10871087

10881088
Register ExtSrc1 = Ext->getOperand(1).getReg();
@@ -1092,13 +1092,11 @@ bool matchUnmergeExtToUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
10921092
if (!LowestVal || LowestVal->Value.getZExtValue() != DstTy.getSizeInBytes())
10931093
return false;
10941094

1095-
MachineInstr *Undef = getDefIgnoringCopies(ExtSrc2, MRI);
1096-
if (!Undef)
1095+
if (!getOpcodeDef<GImplicitDef>(ExtSrc2, MRI))
10971096
return false;
10981097

10991098
MatchInfo = ExtSrc1;
1100-
1101-
return Undef->getOpcode() == TargetOpcode::G_IMPLICIT_DEF;
1099+
return true;
11021100
}
11031101

11041102
void applyUnmergeExtToUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-lowering -global-isel -verify-machineinstrs %s -o - | FileCheck %s
3+
4+
---
5+
name: v4s32
6+
legalized: true
7+
body: |
8+
bb.0.entry:
9+
liveins: $q0
10+
; CHECK-LABEL: name: v4s32
11+
; CHECK: liveins: $q0
12+
; CHECK-NEXT: {{ $}}
13+
; CHECK-NEXT: %v1:_(<4 x s32>) = COPY $q0
14+
; CHECK-NEXT: %unused:_(<2 x s32>), %unmerge:_(<2 x s32>) = G_UNMERGE_VALUES %v1(<4 x s32>)
15+
; CHECK-NEXT: %fpext:_(<2 x s64>) = G_FPEXT %unmerge(<2 x s32>)
16+
; CHECK-NEXT: $q0 = COPY %fpext(<2 x s64>)
17+
; CHECK-NEXT: RET_ReallyLR implicit $q0
18+
%v1:_(<4 x s32>) = COPY $q0
19+
%implicit:_(<4 x s32>) = G_IMPLICIT_DEF
20+
%C:_(s32) = G_CONSTANT i32 8
21+
%ext:_(<4 x s32>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
22+
%unmerge:_(<2 x s32>), %unused:_(<2 x s32>) = G_UNMERGE_VALUES %ext:_(<4 x s32>)
23+
%fpext:_(<2 x s64>) = G_FPEXT %unmerge:_(<2 x s32>)
24+
$q0 = COPY %fpext
25+
RET_ReallyLR implicit $q0
26+
...
27+
---
28+
name: v8s16
29+
legalized: true
30+
body: |
31+
bb.0.entry:
32+
liveins: $q0
33+
; CHECK-LABEL: name: v8s16
34+
; CHECK: liveins: $q0
35+
; CHECK-NEXT: {{ $}}
36+
; CHECK-NEXT: %v1:_(<8 x s16>) = COPY $q0
37+
; CHECK-NEXT: %unused:_(<4 x s16>), %unmerge:_(<4 x s16>) = G_UNMERGE_VALUES %v1(<8 x s16>)
38+
; CHECK-NEXT: %fpext:_(<4 x s32>) = G_FPEXT %unmerge(<4 x s16>)
39+
; CHECK-NEXT: $q0 = COPY %fpext(<4 x s32>)
40+
; CHECK-NEXT: RET_ReallyLR implicit $q0
41+
%v1:_(<8 x s16>) = COPY $q0
42+
%implicit:_(<8 x s16>) = G_IMPLICIT_DEF
43+
%C:_(s32) = G_CONSTANT i32 8
44+
%ext:_(<8 x s16>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
45+
%unmerge:_(<4 x s16>), %unused:_(<4 x s16>) = G_UNMERGE_VALUES %ext:_(<8 x s16>)
46+
%fpext:_(<4 x s32>) = G_FPEXT %unmerge:_(<4 x s16>)
47+
$q0 = COPY %fpext
48+
RET_ReallyLR implicit $q0
49+
...
50+
---
51+
name: v16s8
52+
legalized: true
53+
body: |
54+
bb.0.entry:
55+
liveins: $q0
56+
; CHECK-LABEL: name: v16s8
57+
; CHECK: liveins: $q0
58+
; CHECK-NEXT: {{ $}}
59+
; CHECK-NEXT: %v1:_(<16 x s8>) = COPY $q0
60+
; CHECK-NEXT: %unused:_(<8 x s8>), %unmerge:_(<8 x s8>) = G_UNMERGE_VALUES %v1(<16 x s8>)
61+
; CHECK-NEXT: %fpext:_(<8 x s16>) = G_FPEXT %unmerge(<8 x s8>)
62+
; CHECK-NEXT: $q0 = COPY %fpext(<8 x s16>)
63+
; CHECK-NEXT: RET_ReallyLR implicit $q0
64+
%v1:_(<16 x s8>) = COPY $q0
65+
%implicit:_(<16 x s8>) = G_IMPLICIT_DEF
66+
%C:_(s32) = G_CONSTANT i32 8
67+
%ext:_(<16 x s8>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
68+
%unmerge:_(<8 x s8>), %unused:_(<8 x s8>) = G_UNMERGE_VALUES %ext:_(<16 x s8>)
69+
%fpext:_(<8 x s16>) = G_FPEXT %unmerge:_(<8 x s8>)
70+
$q0 = COPY %fpext
71+
RET_ReallyLR implicit $q0
72+
...
73+
---
74+
name: skip_not_const
75+
legalized: true
76+
body: |
77+
bb.0.entry:
78+
liveins: $q0, $w0
79+
; CHECK-LABEL: name: skip_not_const
80+
; CHECK: liveins: $q0, $w0
81+
; CHECK-NEXT: {{ $}}
82+
; CHECK-NEXT: %v1:_(<16 x s8>) = COPY $q0
83+
; CHECK-NEXT: %implicit:_(<16 x s8>) = G_IMPLICIT_DEF
84+
; CHECK-NEXT: %C:_(s32) = COPY $w0
85+
; CHECK-NEXT: %ext:_(<16 x s8>) = G_EXT %v1, %implicit, %C(s32)
86+
; CHECK-NEXT: %unmerge:_(<8 x s8>), %unused:_(<8 x s8>) = G_UNMERGE_VALUES %ext(<16 x s8>)
87+
; CHECK-NEXT: %fpext:_(<8 x s16>) = G_FPEXT %unmerge(<8 x s8>)
88+
; CHECK-NEXT: $q0 = COPY %fpext(<8 x s16>)
89+
; CHECK-NEXT: RET_ReallyLR implicit $q0
90+
%v1:_(<16 x s8>) = COPY $q0
91+
%implicit:_(<16 x s8>) = G_IMPLICIT_DEF
92+
%C:_(s32) = COPY $w0
93+
%ext:_(<16 x s8>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
94+
%unmerge:_(<8 x s8>), %unused:_(<8 x s8>) = G_UNMERGE_VALUES %ext:_(<16 x s8>)
95+
%fpext:_(<8 x s16>) = G_FPEXT %unmerge:_(<8 x s8>)
96+
$q0 = COPY %fpext
97+
RET_ReallyLR implicit $q0
98+
...
99+
---
100+
name: skip_not_unused
101+
legalized: true
102+
body: |
103+
bb.0.entry:
104+
liveins: $q0
105+
; CHECK-LABEL: name: skip_not_unused
106+
; CHECK: liveins: $q0
107+
; CHECK-NEXT: {{ $}}
108+
; CHECK-NEXT: %v1:_(<16 x s8>) = COPY $q0
109+
; CHECK-NEXT: %implicit:_(<16 x s8>) = G_IMPLICIT_DEF
110+
; CHECK-NEXT: %C:_(s32) = G_CONSTANT i32 8
111+
; CHECK-NEXT: %ext:_(<16 x s8>) = G_EXT %v1, %implicit, %C(s32)
112+
; CHECK-NEXT: %unmerge:_(<8 x s8>), %unused:_(<8 x s8>) = G_UNMERGE_VALUES %ext(<16 x s8>)
113+
; CHECK-NEXT: %fpext:_(<8 x s16>) = G_FPEXT %unmerge(<8 x s8>)
114+
; CHECK-NEXT: %fpext2:_(<8 x s16>) = G_FPEXT %unused(<8 x s8>)
115+
; CHECK-NEXT: $q0 = COPY %fpext(<8 x s16>)
116+
; CHECK-NEXT: $q1 = COPY %fpext2(<8 x s16>)
117+
; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
118+
%v1:_(<16 x s8>) = COPY $q0
119+
%implicit:_(<16 x s8>) = G_IMPLICIT_DEF
120+
%C:_(s32) = G_CONSTANT i32 8
121+
%ext:_(<16 x s8>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
122+
%unmerge:_(<8 x s8>), %unused:_(<8 x s8>) = G_UNMERGE_VALUES %ext:_(<16 x s8>)
123+
%fpext:_(<8 x s16>) = G_FPEXT %unmerge:_(<8 x s8>)
124+
%fpext2:_(<8 x s16>) = G_FPEXT %unused:_(<8 x s8>)
125+
$q0 = COPY %fpext
126+
$q1 = COPY %fpext2
127+
RET_ReallyLR implicit $q0, implicit $q1
128+
...
129+
---
130+
name: skip_borders
131+
legalized: true
132+
body: |
133+
bb.0.entry:
134+
liveins: $q0
135+
; CHECK-LABEL: name: skip_borders
136+
; CHECK: liveins: $q0
137+
; CHECK-NEXT: {{ $}}
138+
; CHECK-NEXT: %v1:_(<4 x s32>) = COPY $q0
139+
; CHECK-NEXT: %implicit:_(<4 x s32>) = G_IMPLICIT_DEF
140+
; CHECK-NEXT: %C:_(s32) = G_CONSTANT i32 9
141+
; CHECK-NEXT: %ext:_(<4 x s32>) = G_EXT %v1, %implicit, %C(s32)
142+
; CHECK-NEXT: %unmerge:_(<2 x s32>), %unused:_(<2 x s32>) = G_UNMERGE_VALUES %ext(<4 x s32>)
143+
; CHECK-NEXT: %fpext:_(<2 x s64>) = G_FPEXT %unmerge(<2 x s32>)
144+
; CHECK-NEXT: $q0 = COPY %fpext(<2 x s64>)
145+
; CHECK-NEXT: RET_ReallyLR implicit $q0
146+
%v1:_(<4 x s32>) = COPY $q0
147+
%implicit:_(<4 x s32>) = G_IMPLICIT_DEF
148+
%C:_(s32) = G_CONSTANT i32 9
149+
%ext:_(<4 x s32>) = G_EXT %v1:_, %implicit:_, %C:_(s32)
150+
%unmerge:_(<2 x s32>), %unused:_(<2 x s32>) = G_UNMERGE_VALUES %ext:_(<4 x s32>)
151+
%fpext:_(<2 x s64>) = G_FPEXT %unmerge:_(<2 x s32>)
152+
$q0 = COPY %fpext
153+
RET_ReallyLR implicit $q0
154+
...

0 commit comments

Comments
 (0)