Skip to content

Commit 65dd453

Browse files
authored
Merge branch 'main' into fix_layout_assign
2 parents cc956c6 + 0d21c95 commit 65dd453

File tree

7 files changed

+228
-47
lines changed

7 files changed

+228
-47
lines changed

llvm/lib/Target/BPF/BTFDebug.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -976,11 +976,24 @@ void BTFDebug::visitMapDefType(const DIType *Ty, uint32_t &TypeId) {
976976
if (Tag != dwarf::DW_TAG_structure_type || CTy->isForwardDecl())
977977
return;
978978

979-
// Visit all struct members to ensure pointee type is visited
979+
// Visit all struct members to ensure their types are visited.
980980
const DINodeArray Elements = CTy->getElements();
981981
for (const auto *Element : Elements) {
982982
const auto *MemberType = cast<DIDerivedType>(Element);
983-
visitTypeEntry(MemberType->getBaseType());
983+
const DIType *MemberBaseType = MemberType->getBaseType();
984+
985+
// If the member is a composite type, that may indicate the currently
986+
// visited composite type is a wrapper, and the member represents the
987+
// actual map definition.
988+
// In that case, visit the member with `visitMapDefType` instead of
989+
// `visitTypeEntry`, treating it specifically as a map definition rather
990+
// than as a regular composite type.
991+
const auto *MemberCTy = dyn_cast<DICompositeType>(MemberBaseType);
992+
if (MemberCTy) {
993+
visitMapDefType(MemberBaseType, TypeId);
994+
} else {
995+
visitTypeEntry(MemberBaseType);
996+
}
984997
}
985998

986999
// Visit this type, struct or a const/typedef/volatile/restrict type

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58844,16 +58844,18 @@ static SDValue combineConcatVectorOps(const SDLoc &DL, MVT VT,
5884458844
llvm::all_of(Ops, [](SDValue Op) {
5884558845
return Op.getConstantOperandAPInt(1) == 32;
5884658846
})) {
58847-
SDValue Res = DAG.getBitcast(MVT::v8i32, ConcatSubOperand(VT, Ops, 0));
58848-
SDValue Zero = getZeroVector(MVT::v8i32, Subtarget, DAG, DL);
58849-
if (Opcode == X86ISD::VSHLI) {
58850-
Res = DAG.getVectorShuffle(MVT::v8i32, DL, Res, Zero,
58851-
{8, 0, 8, 2, 8, 4, 8, 6});
58852-
} else {
58853-
Res = DAG.getVectorShuffle(MVT::v8i32, DL, Res, Zero,
58854-
{1, 8, 3, 8, 5, 8, 7, 8});
58847+
if (SDValue Res = CombineSubOperand(VT, Ops, 0)) {
58848+
SDValue Zero = getZeroVector(MVT::v8i32, Subtarget, DAG, DL);
58849+
Res = DAG.getBitcast(MVT::v8i32, Res);
58850+
if (Opcode == X86ISD::VSHLI) {
58851+
Res = DAG.getVectorShuffle(MVT::v8i32, DL, Res, Zero,
58852+
{8, 0, 8, 2, 8, 4, 8, 6});
58853+
} else {
58854+
Res = DAG.getVectorShuffle(MVT::v8i32, DL, Res, Zero,
58855+
{1, 8, 3, 8, 5, 8, 7, 8});
58856+
}
58857+
return DAG.getBitcast(VT, Res);
5885558858
}
58856-
return DAG.getBitcast(VT, Res);
5885758859
}
5885858860
[[fallthrough]];
5885958861
case X86ISD::VSRAI:

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,22 @@ static cl::opt<bool>
265265
cl::desc("Print name of local stack variable"),
266266
cl::Hidden, cl::init(true));
267267

268-
static cl::opt<bool> ClPoisonUndef("msan-poison-undef",
269-
cl::desc("poison undef temps"), cl::Hidden,
270-
cl::init(true));
268+
static cl::opt<bool>
269+
ClPoisonUndef("msan-poison-undef",
270+
cl::desc("Poison fully undef temporary values. "
271+
"Partially undefined constant vectors "
272+
"are unaffected by this flag (see "
273+
"-msan-poison-undef-vectors)."),
274+
cl::Hidden, cl::init(true));
275+
276+
static cl::opt<bool> ClPoisonUndefVectors(
277+
"msan-poison-undef-vectors",
278+
cl::desc("Precisely poison partially undefined constant vectors. "
279+
"If false (legacy behavior), the entire vector is "
280+
"considered fully initialized, which may lead to false "
281+
"negatives. Fully undefined constant vectors are "
282+
"unaffected by this flag (see -msan-poison-undef)."),
283+
cl::Hidden, cl::init(false));
271284

272285
static cl::opt<bool>
273286
ClHandleICmp("msan-handle-icmp",
@@ -1181,6 +1194,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
11811194
bool PropagateShadow;
11821195
bool PoisonStack;
11831196
bool PoisonUndef;
1197+
bool PoisonUndefVectors;
11841198

11851199
struct ShadowOriginAndInsertPoint {
11861200
Value *Shadow;
@@ -1207,6 +1221,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
12071221
PropagateShadow = SanitizeFunction;
12081222
PoisonStack = SanitizeFunction && ClPoisonStack;
12091223
PoisonUndef = SanitizeFunction && ClPoisonUndef;
1224+
PoisonUndefVectors = SanitizeFunction && ClPoisonUndefVectors;
12101225

12111226
// In the presence of unreachable blocks, we may see Phi nodes with
12121227
// incoming nodes from such blocks. Since InstVisitor skips unreachable
@@ -1989,6 +2004,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
19892004
}
19902005
return Shadow;
19912006
}
2007+
// Handle fully undefined values
2008+
// (partially undefined constant vectors are handled later)
19922009
if (UndefValue *U = dyn_cast<UndefValue>(V)) {
19932010
Value *AllOnes = (PropagateShadow && PoisonUndef) ? getPoisonedShadow(V)
19942011
: getCleanShadow(V);
@@ -2086,8 +2103,27 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
20862103
return ShadowPtr;
20872104
}
20882105

2089-
// TODO: Partially undefined vectors are handled by the fall-through case
2090-
// below (see partial-poison.ll); this causes false negatives.
2106+
// Check for partially-undefined constant vectors
2107+
// TODO: scalable vectors (this is hard because we do not have IRBuilder)
2108+
if (isa<FixedVectorType>(V->getType()) && isa<Constant>(V) &&
2109+
cast<Constant>(V)->containsUndefOrPoisonElement() && PropagateShadow &&
2110+
PoisonUndefVectors) {
2111+
unsigned NumElems = cast<FixedVectorType>(V->getType())->getNumElements();
2112+
SmallVector<Constant *, 32> ShadowVector(NumElems);
2113+
for (unsigned i = 0; i != NumElems; ++i) {
2114+
Constant *Elem = cast<Constant>(V)->getAggregateElement(i);
2115+
ShadowVector[i] = isa<UndefValue>(Elem) ? getPoisonedShadow(Elem)
2116+
: getCleanShadow(Elem);
2117+
}
2118+
2119+
Value *ShadowConstant = ConstantVector::get(ShadowVector);
2120+
LLVM_DEBUG(dbgs() << "Partial undef constant vector: " << *V << " ==> "
2121+
<< *ShadowConstant << "\n");
2122+
2123+
return ShadowConstant;
2124+
}
2125+
2126+
// TODO: partially-undefined constant arrays, structures, and nested types
20912127

20922128
// For everything else the shadow is zero.
20932129
return getCleanShadow(V);
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
; RUN: llc -mtriple=bpfel -mcpu=v3 -filetype=obj -o %t1 %s
2+
; RUN: llvm-objcopy --dump-section='.BTF'=%t2 %t1
3+
; RUN: %python %p/print_btf.py %t2 | FileCheck -check-prefixes=CHECK-BTF-SHORT %s
4+
; RUN: %python %p/print_btf.py %t2 | FileCheck -check-prefixes=CHECK-BTF %s
5+
6+
; Source code:
7+
; struct key { int i; };
8+
; struct val { int j; };
9+
;
10+
; #define __uint(name, val) int (*name)[val]
11+
; #define __type(name, val) typeof(val) *name
12+
;
13+
; struct {
14+
; struct {
15+
; __uint(type, 1);
16+
; __uint(max_entries, 1337);
17+
; __type(key, struct key);
18+
; __type(value, struct val);
19+
; } map_def;
20+
; } map __attribute__((section(".maps")));
21+
; Compilation flag:
22+
; clang -target bpf -O2 -g -S -emit-llvm t.c
23+
24+
; ModuleID = 'bpf.c'
25+
source_filename = "bpf.c"
26+
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
27+
target triple = "bpf"
28+
29+
%struct.anon = type { %struct.anon.0 }
30+
%struct.anon.0 = type { ptr, ptr, ptr, ptr }
31+
32+
@map = dso_local local_unnamed_addr global %struct.anon zeroinitializer, section ".maps", align 8, !dbg !0
33+
34+
; We expect exactly 4 structs:
35+
; * key
36+
; * val
37+
; * inner map type (the actual definition)
38+
; * outer map type (the wrapper)
39+
;
40+
; CHECK-BTF-SHORT-COUNT-4: STRUCT
41+
; CHECK-BTF-SHORT-NOT: STRUCT
42+
43+
; We expect no forward declarations.
44+
;
45+
; CHECK-BTF-SHORT-NOT: FWD
46+
47+
; Assert the whole BTF.
48+
;
49+
; CHECK-BTF: [1] PTR '(anon)' type_id=3
50+
; CHECK-BTF-NEXT: [2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
51+
; CHECK-BTF-NEXT: [3] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=1
52+
; CHECK-BTF-NEXT: [4] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
53+
; CHECK-BTF-NEXT: [5] PTR '(anon)' type_id=6
54+
; CHECK-BTF-NEXT: [6] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=1337
55+
; CHECK-BTF-NEXT: [7] PTR '(anon)' type_id=8
56+
;
57+
; Before bug https://github.com/llvm/llvm-project/issues/143361 was fixed, the
58+
; BTF kind of MyKey (#6) and MyValue (#9) would be FWD instead of STRUCT. The
59+
; main goal of this test is making sure that the full STRUCT BTF is generated
60+
; for these types.
61+
;
62+
; CHECK-BTF-NEXT: [8] STRUCT 'key' size=4 vlen=1
63+
; CHECK-BTF-NEXT: 'i' type_id=2 bits_offset=0
64+
; CHECK-BTF-NEXT: [9] PTR '(anon)' type_id=10
65+
; CHECK-BTF-NEXT: [10] STRUCT 'val' size=4 vlen=1
66+
; CHECK-BTF-NEXT: 'j' type_id=2 bits_offset=0
67+
; CHECK-BTF-NEXT: [11] STRUCT '(anon)' size=32 vlen=4
68+
; CHECK-BTF-NEXT: 'type' type_id=1 bits_offset=0
69+
; CHECK-BTF-NEXT: 'max_entries' type_id=5 bits_offset=64
70+
; CHECK-BTF-NEXT: 'key' type_id=7 bits_offset=128
71+
; CHECK-BTF-NEXT: 'value' type_id=9 bits_offset=192
72+
; CHECK-BTF-NEXT: [12] STRUCT '(anon)' size=32 vlen=1
73+
; CHECK-BTF-NEXT: 'map_def' type_id=11 bits_offset=0
74+
; CHECK-BTF-NEXT: [13] VAR 'map' type_id=12, linkage=global
75+
; CHECK-BTF-NEXT: [14] DATASEC '.maps' size=0 vlen=1
76+
; CHECK-BTF-NEXT: type_id=13 offset=0 size=32
77+
78+
!llvm.dbg.cu = !{!2}
79+
!llvm.module.flags = !{!31, !32, !33, !34}
80+
!llvm.ident = !{!35}
81+
82+
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
83+
!1 = distinct !DIGlobalVariable(name: "map", scope: !2, file: !3, line: 14, type: !5, isLocal: false, isDefinition: true)
84+
!2 = distinct !DICompileUnit(language: DW_LANG_C11, file: !3, producer: "clang version 21.0.0git ([email protected]:llvm/llvm-project.git c935bd3798b39330aab2c9ca29a519457d5e5245)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None)
85+
!3 = !DIFile(filename: "bpf.c", directory: "/tmp", checksumkind: CSK_MD5, checksum: "2330cce6d83c72ef5335abc3016de28e")
86+
!4 = !{!0}
87+
!5 = distinct !DICompositeType(tag: DW_TAG_structure_type, file: !3, line: 7, size: 256, elements: !6)
88+
!6 = !{!7}
89+
!7 = !DIDerivedType(tag: DW_TAG_member, name: "map_def", scope: !5, file: !3, line: 13, baseType: !8, size: 256)
90+
!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, scope: !5, file: !3, line: 8, size: 256, elements: !9)
91+
!9 = !{!10, !16, !21, !26}
92+
!10 = !DIDerivedType(tag: DW_TAG_member, name: "type", scope: !8, file: !3, line: 9, baseType: !11, size: 64)
93+
!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64)
94+
!12 = !DICompositeType(tag: DW_TAG_array_type, baseType: !13, size: 32, elements: !14)
95+
!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
96+
!14 = !{!15}
97+
!15 = !DISubrange(count: 1)
98+
!16 = !DIDerivedType(tag: DW_TAG_member, name: "max_entries", scope: !8, file: !3, line: 10, baseType: !17, size: 64, offset: 64)
99+
!17 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64)
100+
!18 = !DICompositeType(tag: DW_TAG_array_type, baseType: !13, size: 42784, elements: !19)
101+
!19 = !{!20}
102+
!20 = !DISubrange(count: 1337)
103+
!21 = !DIDerivedType(tag: DW_TAG_member, name: "key", scope: !8, file: !3, line: 11, baseType: !22, size: 64, offset: 128)
104+
!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !23, size: 64)
105+
!23 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "key", file: !3, line: 1, size: 32, elements: !24)
106+
!24 = !{!25}
107+
!25 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !23, file: !3, line: 1, baseType: !13, size: 32)
108+
!26 = !DIDerivedType(tag: DW_TAG_member, name: "value", scope: !8, file: !3, line: 12, baseType: !27, size: 64, offset: 192)
109+
!27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28, size: 64)
110+
!28 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "val", file: !3, line: 2, size: 32, elements: !29)
111+
!29 = !{!30}
112+
!30 = !DIDerivedType(tag: DW_TAG_member, name: "j", scope: !28, file: !3, line: 2, baseType: !13, size: 32)
113+
!31 = !{i32 7, !"Dwarf Version", i32 5}
114+
!32 = !{i32 2, !"Debug Info Version", i32 3}
115+
!33 = !{i32 1, !"wchar_size", i32 4}
116+
!34 = !{i32 7, !"frame-pointer", i32 2}
117+
!35 = !{!"clang version 21.0.0git ([email protected]:llvm/llvm-project.git c935bd3798b39330aab2c9ca29a519457d5e5245)"}

llvm/test/CodeGen/X86/vector-shift-lshr-256.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,11 +1974,9 @@ define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {
19741974
define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
19751975
; AVX1-LABEL: shift32_v4i64_concat:
19761976
; AVX1: # %bb.0:
1977-
; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1977+
; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0
1978+
; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm1
19781979
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1979-
; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1980-
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]
1981-
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
19821980
; AVX1-NEXT: retq
19831981
;
19841982
; AVX2-LABEL: shift32_v4i64_concat:
@@ -1990,11 +1988,9 @@ define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
19901988
;
19911989
; XOPAVX1-LABEL: shift32_v4i64_concat:
19921990
; XOPAVX1: # %bb.0:
1993-
; XOPAVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1991+
; XOPAVX1-NEXT: vpsrlq $32, %xmm0, %xmm0
1992+
; XOPAVX1-NEXT: vpsrlq $32, %xmm1, %xmm1
19941993
; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1995-
; XOPAVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1996-
; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]
1997-
; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
19981994
; XOPAVX1-NEXT: retq
19991995
;
20001996
; XOPAVX2-LABEL: shift32_v4i64_concat:
@@ -2020,11 +2016,9 @@ define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
20202016
;
20212017
; X86-AVX1-LABEL: shift32_v4i64_concat:
20222018
; X86-AVX1: # %bb.0:
2023-
; X86-AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
2019+
; X86-AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0
2020+
; X86-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm1
20242021
; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2025-
; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
2026-
; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]
2027-
; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
20282022
; X86-AVX1-NEXT: retl
20292023
;
20302024
; X86-AVX2-LABEL: shift32_v4i64_concat:

llvm/test/CodeGen/X86/vector-shift-shl-256.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,11 +1827,9 @@ define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {
18271827
define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
18281828
; AVX1-LABEL: shift32_v4i64_concat:
18291829
; AVX1: # %bb.0:
1830-
; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1830+
; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0
1831+
; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1
18311832
; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1832-
; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1833-
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1834-
; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
18351833
; AVX1-NEXT: retq
18361834
;
18371835
; AVX2-LABEL: shift32_v4i64_concat:
@@ -1843,11 +1841,9 @@ define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
18431841
;
18441842
; XOPAVX1-LABEL: shift32_v4i64_concat:
18451843
; XOPAVX1: # %bb.0:
1846-
; XOPAVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1844+
; XOPAVX1-NEXT: vpsllq $32, %xmm0, %xmm0
1845+
; XOPAVX1-NEXT: vpsllq $32, %xmm1, %xmm1
18471846
; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1848-
; XOPAVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1849-
; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1850-
; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
18511847
; XOPAVX1-NEXT: retq
18521848
;
18531849
; XOPAVX2-LABEL: shift32_v4i64_concat:
@@ -1873,11 +1869,9 @@ define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {
18731869
;
18741870
; X86-AVX1-LABEL: shift32_v4i64_concat:
18751871
; X86-AVX1: # %bb.0:
1876-
; X86-AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0
1872+
; X86-AVX1-NEXT: vpsllq $32, %xmm0, %xmm0
1873+
; X86-AVX1-NEXT: vpsllq $32, %xmm1, %xmm1
18771874
; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1878-
; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
1879-
; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[0,2],ymm0[0,2],ymm1[4,6],ymm0[4,6]
1880-
; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]
18811875
; X86-AVX1-NEXT: retl
18821876
;
18831877
; X86-AVX2-LABEL: shift32_v4i64_concat:

0 commit comments

Comments
 (0)