Skip to content

Commit 21007f6

Browse files
Use set of sources
1 parent e6c5082 commit 21007f6

File tree

2 files changed

+24
-29
lines changed

2 files changed

+24
-29
lines changed

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#include "llvm/CodeGenTypes/MachineValueType.h"
4444
#include "llvm/Support/Debug.h"
4545
#include <cassert>
46-
#include <iostream>
46+
#include <set>
4747

4848
#define GET_GICOMBINER_DEPS
4949
#include "AArch64GenPostLegalizeGICombiner.inc"
@@ -146,6 +146,8 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
146146
undefinedValues.clear();
147147
unmergedValues.clear();
148148

149+
std::set<int> knownRegs;
150+
149151
for (auto Use : MI.all_uses()) {
150152
auto *Def = getDefIgnoringCopies(Use.getReg(), MRI);
151153

@@ -170,15 +172,19 @@ bool matchCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
170172
unmergedValues.clear();
171173
return false;
172174
}
173-
174-
unmergedValues.push_back(Def->getOperand(2).getReg());
175+
if (knownRegs.find(Def->getOperand(2).getReg().id()) == knownRegs.end()) {
176+
knownRegs.insert(Def->getOperand(2).getReg().id());
177+
unmergedValues.push_back(Def->getOperand(2).getReg());
178+
}
179+
else
180+
continue;
175181

176182
break;
177183
}
178184
}
179185

180-
if (!(undefinedValues.size() == 2 && unmergedValues.size() == 2) &&
181-
!(undefinedValues.size() == 0 && unmergedValues.size() == 4)) {
186+
if (!(undefinedValues.size() == 2 && unmergedValues.size() == 1) &&
187+
!(undefinedValues.size() == 0 && unmergedValues.size() == 2)) {
182188
undefinedValues.clear();
183189
unmergedValues.clear();
184190
return false;
@@ -193,7 +199,7 @@ void applyCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
193199
SmallVectorImpl<Register> &undefinedValues) {
194200
B.setInstrAndDebugLoc(MI);
195201

196-
if (unmergedValues.size() == 2) {
202+
if (unmergedValues.size() == 1) {
197203
auto llt = LLT::fixed_vector(
198204
undefinedValues.size(),
199205
LLT::scalar(MRI.getType(unmergedValues[0]).getScalarSizeInBits()));
@@ -202,8 +208,9 @@ void applyCombineBuildUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
202208
B.buildBuildVector(DefVec, undefinedValues);
203209
B.buildConcatVectors(MI.getOperand(0), {unmergedValues[0], DefVec});
204210
} else {
211+
return;
205212
B.buildConcatVectors(MI.getOperand(0),
206-
{unmergedValues[0], unmergedValues[3]});
213+
{unmergedValues[0], unmergedValues[1]});
207214
}
208215

209216
MI.eraseFromParent();

llvm/test/CodeGen/AArch64/arm64-neon-copy.ll

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,17 +1268,11 @@ define <8 x i16> @testDUP.v1i16(<1 x i16> %a) {
12681268
}
12691269

12701270
define <4 x i32> @testDUP.v1i32(<1 x i32> %a) {
1271-
; CHECK-SD-LABEL: testDUP.v1i32:
1272-
; CHECK-SD: // %bb.0:
1273-
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
1274-
; CHECK-SD-NEXT: dup v0.4s, v0.s[0]
1275-
; CHECK-SD-NEXT: ret
1276-
;
1277-
; CHECK-GI-LABEL: testDUP.v1i32:
1278-
; CHECK-GI: // %bb.0:
1279-
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
1280-
; CHECK-GI-NEXT: mov v0.d[1], v0.d[0]
1281-
; CHECK-GI-NEXT: ret
1271+
; CHECK-LABEL: testDUP.v1i32:
1272+
; CHECK: // %bb.0:
1273+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
1274+
; CHECK-NEXT: dup v0.4s, v0.s[0]
1275+
; CHECK-NEXT: ret
12821276
%b = extractelement <1 x i32> %a, i32 0
12831277
%c = insertelement <4 x i32> undef, i32 %b, i32 0
12841278
%d = insertelement <4 x i32> %c, i32 %b, i32 1
@@ -2249,17 +2243,11 @@ define <4 x i16> @concat_vector_v4i16(<1 x i16> %a) {
22492243
}
22502244

22512245
define <4 x i32> @concat_vector_v4i32(<1 x i32> %a) {
2252-
; CHECK-SD-LABEL: concat_vector_v4i32:
2253-
; CHECK-SD: // %bb.0:
2254-
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
2255-
; CHECK-SD-NEXT: dup v0.4s, v0.s[0]
2256-
; CHECK-SD-NEXT: ret
2257-
;
2258-
; CHECK-GI-LABEL: concat_vector_v4i32:
2259-
; CHECK-GI: // %bb.0:
2260-
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
2261-
; CHECK-GI-NEXT: mov v0.d[1], v0.d[0]
2262-
; CHECK-GI-NEXT: ret
2246+
; CHECK-LABEL: concat_vector_v4i32:
2247+
; CHECK: // %bb.0:
2248+
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
2249+
; CHECK-NEXT: dup v0.4s, v0.s[0]
2250+
; CHECK-NEXT: ret
22632251
%r = shufflevector <1 x i32> %a, <1 x i32> undef, <4 x i32> zeroinitializer
22642252
ret <4 x i32> %r
22652253
}

0 commit comments

Comments
 (0)