Skip to content

Commit 4b57b2f

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:acb7dfaa017d into amd-gfx:4b60f60dc3ac
Local branch amd-gfx 4b60f60 Merged main:6c42d0d7df55 into amd-gfx:5fd03520a677 Remote branch main acb7dfa [clang][bytecode] Create local scopes for if then/else statements (llvm#120852)
2 parents 4b60f60 + acb7dfa commit 4b57b2f

File tree

10 files changed

+477
-61
lines changed

10 files changed

+477
-61
lines changed

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4974,20 +4974,35 @@ template <class Emitter> bool Compiler<Emitter>::visitIfStmt(const IfStmt *IS) {
49744974
LabelTy LabelEnd = this->getLabel();
49754975
if (!this->jumpFalse(LabelElse))
49764976
return false;
4977-
if (!visitStmt(IS->getThen()))
4978-
return false;
4977+
{
4978+
LocalScope<Emitter> ThenScope(this);
4979+
if (!visitStmt(IS->getThen()))
4980+
return false;
4981+
if (!ThenScope.destroyLocals())
4982+
return false;
4983+
}
49794984
if (!this->jump(LabelEnd))
49804985
return false;
49814986
this->emitLabel(LabelElse);
4982-
if (!visitStmt(Else))
4983-
return false;
4987+
{
4988+
LocalScope<Emitter> ElseScope(this);
4989+
if (!visitStmt(Else))
4990+
return false;
4991+
if (!ElseScope.destroyLocals())
4992+
return false;
4993+
}
49844994
this->emitLabel(LabelEnd);
49854995
} else {
49864996
LabelTy LabelEnd = this->getLabel();
49874997
if (!this->jumpFalse(LabelEnd))
49884998
return false;
4989-
if (!visitStmt(IS->getThen()))
4990-
return false;
4999+
{
5000+
LocalScope<Emitter> ThenScope(this);
5001+
if (!visitStmt(IS->getThen()))
5002+
return false;
5003+
if (!ThenScope.destroyLocals())
5004+
return false;
5005+
}
49915006
this->emitLabel(LabelEnd);
49925007
}
49935008

clang/lib/Format/MacroExpander.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,10 @@ MacroExpander::expand(FormatToken *ID,
233233
if (Result.size() > 1) {
234234
++Result[0]->MacroCtx->StartOfExpansion;
235235
++Result[Result.size() - 2]->MacroCtx->EndOfExpansion;
236+
} else {
237+
// If the macro expansion is empty, mark the start and end.
238+
Result[0]->MacroCtx->StartOfExpansion = 1;
239+
Result[0]->MacroCtx->EndOfExpansion = 1;
236240
}
237241
return Result;
238242
}

clang/test/AST/ByteCode/if.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,30 @@ namespace IfScope {
7676
}
7777
static_assert(foo() == 13, "");
7878
}
79+
80+
namespace IfScope2 {
81+
struct __bit_iterator {
82+
unsigned __ctz_;
83+
};
84+
constexpr void __fill_n_bool(__bit_iterator) {}
85+
86+
constexpr void fill_n(__bit_iterator __first) {
87+
if (false)
88+
__fill_n_bool(__first);
89+
else
90+
__fill_n_bool(__first);
91+
}
92+
93+
struct bitset{
94+
constexpr void reset() {
95+
auto m = __bit_iterator(8);
96+
fill_n(m);
97+
}
98+
};
99+
consteval bool foo() {
100+
bitset v;
101+
v.reset();
102+
return true;
103+
}
104+
static_assert(foo());
105+
}

clang/unittests/Format/MacroCallReconstructorTest.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ class Expansion {
6565
}
6666
Unexpanded[ID] = std::move(UnexpandedLine);
6767

68-
auto Expanded = uneof(Macros.expand(ID, Args));
68+
auto Expanded = Macros.expand(ID, Args);
69+
if (Expanded.size() > 1)
70+
Expanded = uneof(Expanded);
6971
Tokens.append(Expanded.begin(), Expanded.end());
7072

7173
TokenList UnexpandedTokens;
@@ -217,6 +219,31 @@ TEST_F(MacroCallReconstructorTest, Identifier) {
217219
EXPECT_THAT(std::move(Unexp).takeResult(), matchesLine(line(U.consume("X"))));
218220
}
219221

222+
TEST_F(MacroCallReconstructorTest, EmptyDefinition) {
223+
auto Macros = createExpander({"X"});
224+
Expansion Exp(Lex, *Macros);
225+
TokenList Call = Exp.expand("X");
226+
227+
MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
228+
Unexp.addLine(line(Exp.getTokens()));
229+
EXPECT_TRUE(Unexp.finished());
230+
Matcher U(Call, Lex);
231+
EXPECT_THAT(std::move(Unexp).takeResult(), matchesLine(line(U.consume("X"))));
232+
}
233+
234+
TEST_F(MacroCallReconstructorTest, EmptyExpansion) {
235+
auto Macros = createExpander({"A(x)=x"});
236+
Expansion Exp(Lex, *Macros);
237+
TokenList Call = Exp.expand("A", {""});
238+
239+
MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
240+
Unexp.addLine(line(Exp.getTokens()));
241+
EXPECT_TRUE(Unexp.finished());
242+
Matcher U(Call, Lex);
243+
EXPECT_THAT(std::move(Unexp).takeResult(),
244+
matchesLine(line(U.consume("A()"))));
245+
}
246+
220247
TEST_F(MacroCallReconstructorTest, NestedLineWithinCall) {
221248
auto Macros = createExpander({"C(a)=class X { a; };"});
222249
Expansion Exp(Lex, *Macros);

llvm/include/llvm/Config/llvm-config.h.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
/* Indicate that this is LLVM compiled from the amd-gfx branch. */
1818
#define LLVM_HAVE_BRANCH_AMD_GFX
19-
#define LLVM_MAIN_REVISION 522231
19+
#define LLVM_MAIN_REVISION 522237
2020

2121
/* Define if LLVM_ENABLE_DUMP is enabled */
2222
#cmakedefine LLVM_ENABLE_DUMP

llvm/lib/MC/WasmObjectWriter.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -734,12 +734,9 @@ static void addData(SmallVectorImpl<char> &DataBytes,
734734
DataBytes.insert(DataBytes.end(), Fill->getValueSize() * NumValues,
735735
Fill->getValue());
736736
} else if (auto *LEB = dyn_cast<MCLEBFragment>(&Frag)) {
737-
const SmallVectorImpl<char> &Contents = LEB->getContents();
738-
llvm::append_range(DataBytes, Contents);
737+
llvm::append_range(DataBytes, LEB->getContents());
739738
} else {
740-
const auto &DataFrag = cast<MCDataFragment>(Frag);
741-
const SmallVectorImpl<char> &Contents = DataFrag.getContents();
742-
llvm::append_range(DataBytes, Contents);
739+
llvm::append_range(DataBytes, cast<MCDataFragment>(Frag).getContents());
743740
}
744741
}
745742

@@ -1896,14 +1893,7 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm,
18961893
report_fatal_error("invalid .init_array section priority");
18971894
}
18981895
const auto &DataFrag = cast<MCDataFragment>(Frag);
1899-
const SmallVectorImpl<char> &Contents = DataFrag.getContents();
1900-
for (const uint8_t *
1901-
P = (const uint8_t *)Contents.data(),
1902-
*End = (const uint8_t *)Contents.data() + Contents.size();
1903-
P != End; ++P) {
1904-
if (*P != 0)
1905-
report_fatal_error("non-symbolic data in .init_array section");
1906-
}
1896+
assert(llvm::all_of(DataFrag.getContents(), [](char C) { return !C; }));
19071897
for (const MCFixup &Fixup : DataFrag.getFixups()) {
19081898
assert(Fixup.getKind() ==
19091899
MCFixup::getKindForSize(is64Bit() ? 8 : 4, false));

llvm/lib/MC/WinCOFFObjectWriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ void WinCOFFWriter::defineSection(const MCAssembler &Asm,
323323
Section->MCSection = &MCSec;
324324
SectionMap[&MCSec] = Section;
325325

326-
if (UseOffsetLabels && !MCSec.empty()) {
326+
if (UseOffsetLabels) {
327327
const uint32_t Interval = 1 << OffsetLabelIntervalBits;
328328
uint32_t N = 1;
329329
for (uint32_t Off = Interval, E = Asm.getSectionAddressSize(MCSec); Off < E;

llvm/test/CodeGen/AArch64/GlobalISel/legalize-bitreverse.mir

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,183 @@ body: |
186186
$d0 = COPY %bitreverse
187187
RET_ReallyLR implicit $q0
188188
...
189+
---
190+
name: v2s32
191+
tracksRegLiveness: true
192+
body: |
193+
bb.0:
194+
liveins: $d0
195+
; CHECK-LABEL: name: v2s32
196+
; CHECK: liveins: $d0
197+
; CHECK-NEXT: {{ $}}
198+
; CHECK-NEXT: %vec:_(<2 x s32>) = COPY $d0
199+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(<2 x s32>) = G_BSWAP %vec
200+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
201+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
202+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -252645136
203+
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), [[C1]](s32)
204+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(<2 x s32>) = G_AND [[BSWAP]], [[BUILD_VECTOR1]]
205+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x s32>) = G_LSHR [[AND]], [[BUILD_VECTOR]](<2 x s32>)
206+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<2 x s32>) = G_SHL [[BSWAP]], [[BUILD_VECTOR]](<2 x s32>)
207+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(<2 x s32>) = G_AND [[SHL]], [[BUILD_VECTOR1]]
208+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(<2 x s32>) = G_OR [[LSHR]], [[AND1]]
209+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
210+
; CHECK-NEXT: [[BUILD_VECTOR2:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C2]](s32), [[C2]](s32)
211+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 -858993460
212+
; CHECK-NEXT: [[BUILD_VECTOR3:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C3]](s32), [[C3]](s32)
213+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(<2 x s32>) = G_AND [[OR]], [[BUILD_VECTOR3]]
214+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<2 x s32>) = G_LSHR [[AND2]], [[BUILD_VECTOR2]](<2 x s32>)
215+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(<2 x s32>) = G_SHL [[OR]], [[BUILD_VECTOR2]](<2 x s32>)
216+
; CHECK-NEXT: [[AND3:%[0-9]+]]:_(<2 x s32>) = G_AND [[SHL1]], [[BUILD_VECTOR3]]
217+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(<2 x s32>) = G_OR [[LSHR1]], [[AND3]]
218+
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
219+
; CHECK-NEXT: [[BUILD_VECTOR4:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C4]](s32), [[C4]](s32)
220+
; CHECK-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1431655766
221+
; CHECK-NEXT: [[BUILD_VECTOR5:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C5]](s32), [[C5]](s32)
222+
; CHECK-NEXT: [[AND4:%[0-9]+]]:_(<2 x s32>) = G_AND [[OR1]], [[BUILD_VECTOR5]]
223+
; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(<2 x s32>) = G_LSHR [[AND4]], [[BUILD_VECTOR4]](<2 x s32>)
224+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(<2 x s32>) = G_SHL [[OR1]], [[BUILD_VECTOR4]](<2 x s32>)
225+
; CHECK-NEXT: [[AND5:%[0-9]+]]:_(<2 x s32>) = G_AND [[SHL2]], [[BUILD_VECTOR5]]
226+
; CHECK-NEXT: %bitreverse:_(<2 x s32>) = G_OR [[LSHR2]], [[AND5]]
227+
; CHECK-NEXT: $d0 = COPY %bitreverse(<2 x s32>)
228+
; CHECK-NEXT: RET_ReallyLR implicit $d0
229+
%vec:_(<2 x s32>) = COPY $d0
230+
%bitreverse:_(<2 x s32>) = G_BITREVERSE %vec
231+
$d0 = COPY %bitreverse
232+
RET_ReallyLR implicit $d0
233+
...
234+
---
235+
name: v2s64
236+
tracksRegLiveness: true
237+
body: |
238+
bb.0:
239+
liveins: $q0
240+
; CHECK-LABEL: name: v2s64
241+
; CHECK: liveins: $q0
242+
; CHECK-NEXT: {{ $}}
243+
; CHECK-NEXT: %vec:_(<2 x s64>) = COPY $q0
244+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(<2 x s64>) = G_BSWAP %vec
245+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4
246+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C]](s64), [[C]](s64)
247+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1085102592571150096
248+
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C1]](s64), [[C1]](s64)
249+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(<2 x s64>) = G_AND [[BSWAP]], [[BUILD_VECTOR1]]
250+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x s64>) = G_LSHR [[AND]], [[BUILD_VECTOR]](<2 x s64>)
251+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<2 x s64>) = G_SHL [[BSWAP]], [[BUILD_VECTOR]](<2 x s64>)
252+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(<2 x s64>) = G_AND [[SHL]], [[BUILD_VECTOR1]]
253+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(<2 x s64>) = G_OR [[LSHR]], [[AND1]]
254+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
255+
; CHECK-NEXT: [[BUILD_VECTOR2:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C2]](s64), [[C2]](s64)
256+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 -3689348814741910324
257+
; CHECK-NEXT: [[BUILD_VECTOR3:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C3]](s64), [[C3]](s64)
258+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(<2 x s64>) = G_AND [[OR]], [[BUILD_VECTOR3]]
259+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<2 x s64>) = G_LSHR [[AND2]], [[BUILD_VECTOR2]](<2 x s64>)
260+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(<2 x s64>) = G_SHL [[OR]], [[BUILD_VECTOR2]](<2 x s64>)
261+
; CHECK-NEXT: [[AND3:%[0-9]+]]:_(<2 x s64>) = G_AND [[SHL1]], [[BUILD_VECTOR3]]
262+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(<2 x s64>) = G_OR [[LSHR1]], [[AND3]]
263+
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
264+
; CHECK-NEXT: [[BUILD_VECTOR4:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C4]](s64), [[C4]](s64)
265+
; CHECK-NEXT: [[C5:%[0-9]+]]:_(s64) = G_CONSTANT i64 -6148914691236517206
266+
; CHECK-NEXT: [[BUILD_VECTOR5:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C5]](s64), [[C5]](s64)
267+
; CHECK-NEXT: [[AND4:%[0-9]+]]:_(<2 x s64>) = G_AND [[OR1]], [[BUILD_VECTOR5]]
268+
; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(<2 x s64>) = G_LSHR [[AND4]], [[BUILD_VECTOR4]](<2 x s64>)
269+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(<2 x s64>) = G_SHL [[OR1]], [[BUILD_VECTOR4]](<2 x s64>)
270+
; CHECK-NEXT: [[AND5:%[0-9]+]]:_(<2 x s64>) = G_AND [[SHL2]], [[BUILD_VECTOR5]]
271+
; CHECK-NEXT: %bitreverse:_(<2 x s64>) = G_OR [[LSHR2]], [[AND5]]
272+
; CHECK-NEXT: $q0 = COPY %bitreverse(<2 x s64>)
273+
; CHECK-NEXT: RET_ReallyLR implicit $q0
274+
%vec:_(<2 x s64>) = COPY $q0
275+
%bitreverse:_(<2 x s64>) = G_BITREVERSE %vec
276+
$q0 = COPY %bitreverse
277+
RET_ReallyLR implicit $q0
278+
...
279+
---
280+
name: v4s32
281+
tracksRegLiveness: true
282+
body: |
283+
bb.0:
284+
liveins: $q0
285+
; CHECK-LABEL: name: v4s32
286+
; CHECK: liveins: $q0
287+
; CHECK-NEXT: {{ $}}
288+
; CHECK-NEXT: %vec:_(<4 x s32>) = COPY $q0
289+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(<4 x s32>) = G_BSWAP %vec
290+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
291+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
292+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -252645136
293+
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C1]](s32), [[C1]](s32), [[C1]](s32), [[C1]](s32)
294+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(<4 x s32>) = G_AND [[BSWAP]], [[BUILD_VECTOR1]]
295+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<4 x s32>) = G_LSHR [[AND]], [[BUILD_VECTOR]](<4 x s32>)
296+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<4 x s32>) = G_SHL [[BSWAP]], [[BUILD_VECTOR]](<4 x s32>)
297+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(<4 x s32>) = G_AND [[SHL]], [[BUILD_VECTOR1]]
298+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(<4 x s32>) = G_OR [[LSHR]], [[AND1]]
299+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
300+
; CHECK-NEXT: [[BUILD_VECTOR2:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C2]](s32), [[C2]](s32), [[C2]](s32), [[C2]](s32)
301+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 -858993460
302+
; CHECK-NEXT: [[BUILD_VECTOR3:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C3]](s32), [[C3]](s32), [[C3]](s32), [[C3]](s32)
303+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(<4 x s32>) = G_AND [[OR]], [[BUILD_VECTOR3]]
304+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<4 x s32>) = G_LSHR [[AND2]], [[BUILD_VECTOR2]](<4 x s32>)
305+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(<4 x s32>) = G_SHL [[OR]], [[BUILD_VECTOR2]](<4 x s32>)
306+
; CHECK-NEXT: [[AND3:%[0-9]+]]:_(<4 x s32>) = G_AND [[SHL1]], [[BUILD_VECTOR3]]
307+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(<4 x s32>) = G_OR [[LSHR1]], [[AND3]]
308+
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
309+
; CHECK-NEXT: [[BUILD_VECTOR4:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C4]](s32), [[C4]](s32), [[C4]](s32), [[C4]](s32)
310+
; CHECK-NEXT: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1431655766
311+
; CHECK-NEXT: [[BUILD_VECTOR5:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C5]](s32), [[C5]](s32), [[C5]](s32), [[C5]](s32)
312+
; CHECK-NEXT: [[AND4:%[0-9]+]]:_(<4 x s32>) = G_AND [[OR1]], [[BUILD_VECTOR5]]
313+
; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(<4 x s32>) = G_LSHR [[AND4]], [[BUILD_VECTOR4]](<4 x s32>)
314+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(<4 x s32>) = G_SHL [[OR1]], [[BUILD_VECTOR4]](<4 x s32>)
315+
; CHECK-NEXT: [[AND5:%[0-9]+]]:_(<4 x s32>) = G_AND [[SHL2]], [[BUILD_VECTOR5]]
316+
; CHECK-NEXT: %bitreverse:_(<4 x s32>) = G_OR [[LSHR2]], [[AND5]]
317+
; CHECK-NEXT: $q0 = COPY %bitreverse(<4 x s32>)
318+
; CHECK-NEXT: RET_ReallyLR implicit $q0
319+
%vec:_(<4 x s32>) = COPY $q0
320+
%bitreverse:_(<4 x s32>) = G_BITREVERSE %vec
321+
$q0 = COPY %bitreverse
322+
RET_ReallyLR implicit $q0
323+
...
324+
---
325+
name: v8s16
326+
tracksRegLiveness: true
327+
body: |
328+
bb.0:
329+
liveins: $q0
330+
; CHECK-LABEL: name: v8s16
331+
; CHECK: liveins: $q0
332+
; CHECK-NEXT: {{ $}}
333+
; CHECK-NEXT: %vec:_(<8 x s16>) = COPY $q0
334+
; CHECK-NEXT: [[BSWAP:%[0-9]+]]:_(<8 x s16>) = G_BSWAP %vec
335+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 4
336+
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C]](s16), [[C]](s16), [[C]](s16), [[C]](s16), [[C]](s16), [[C]](s16), [[C]](s16), [[C]](s16)
337+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 -3856
338+
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C1]](s16), [[C1]](s16), [[C1]](s16), [[C1]](s16), [[C1]](s16), [[C1]](s16), [[C1]](s16), [[C1]](s16)
339+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(<8 x s16>) = G_AND [[BSWAP]], [[BUILD_VECTOR1]]
340+
; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<8 x s16>) = G_LSHR [[AND]], [[BUILD_VECTOR]](<8 x s16>)
341+
; CHECK-NEXT: [[SHL:%[0-9]+]]:_(<8 x s16>) = G_SHL [[BSWAP]], [[BUILD_VECTOR]](<8 x s16>)
342+
; CHECK-NEXT: [[AND1:%[0-9]+]]:_(<8 x s16>) = G_AND [[SHL]], [[BUILD_VECTOR1]]
343+
; CHECK-NEXT: [[OR:%[0-9]+]]:_(<8 x s16>) = G_OR [[LSHR]], [[AND1]]
344+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 2
345+
; CHECK-NEXT: [[BUILD_VECTOR2:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C2]](s16), [[C2]](s16), [[C2]](s16), [[C2]](s16), [[C2]](s16), [[C2]](s16), [[C2]](s16), [[C2]](s16)
346+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 -13108
347+
; CHECK-NEXT: [[BUILD_VECTOR3:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C3]](s16), [[C3]](s16), [[C3]](s16), [[C3]](s16), [[C3]](s16), [[C3]](s16), [[C3]](s16), [[C3]](s16)
348+
; CHECK-NEXT: [[AND2:%[0-9]+]]:_(<8 x s16>) = G_AND [[OR]], [[BUILD_VECTOR3]]
349+
; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<8 x s16>) = G_LSHR [[AND2]], [[BUILD_VECTOR2]](<8 x s16>)
350+
; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(<8 x s16>) = G_SHL [[OR]], [[BUILD_VECTOR2]](<8 x s16>)
351+
; CHECK-NEXT: [[AND3:%[0-9]+]]:_(<8 x s16>) = G_AND [[SHL1]], [[BUILD_VECTOR3]]
352+
; CHECK-NEXT: [[OR1:%[0-9]+]]:_(<8 x s16>) = G_OR [[LSHR1]], [[AND3]]
353+
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
354+
; CHECK-NEXT: [[BUILD_VECTOR4:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C4]](s16), [[C4]](s16), [[C4]](s16), [[C4]](s16), [[C4]](s16), [[C4]](s16), [[C4]](s16), [[C4]](s16)
355+
; CHECK-NEXT: [[C5:%[0-9]+]]:_(s16) = G_CONSTANT i16 -21846
356+
; CHECK-NEXT: [[BUILD_VECTOR5:%[0-9]+]]:_(<8 x s16>) = G_BUILD_VECTOR [[C5]](s16), [[C5]](s16), [[C5]](s16), [[C5]](s16), [[C5]](s16), [[C5]](s16), [[C5]](s16), [[C5]](s16)
357+
; CHECK-NEXT: [[AND4:%[0-9]+]]:_(<8 x s16>) = G_AND [[OR1]], [[BUILD_VECTOR5]]
358+
; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(<8 x s16>) = G_LSHR [[AND4]], [[BUILD_VECTOR4]](<8 x s16>)
359+
; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(<8 x s16>) = G_SHL [[OR1]], [[BUILD_VECTOR4]](<8 x s16>)
360+
; CHECK-NEXT: [[AND5:%[0-9]+]]:_(<8 x s16>) = G_AND [[SHL2]], [[BUILD_VECTOR5]]
361+
; CHECK-NEXT: %bitreverse:_(<8 x s16>) = G_OR [[LSHR2]], [[AND5]]
362+
; CHECK-NEXT: $q0 = COPY %bitreverse(<8 x s16>)
363+
; CHECK-NEXT: RET_ReallyLR implicit $q0
364+
%vec:_(<8 x s16>) = COPY $q0
365+
%bitreverse:_(<8 x s16>) = G_BITREVERSE %vec
366+
$q0 = COPY %bitreverse
367+
RET_ReallyLR implicit $q0
368+
...

0 commit comments

Comments
 (0)