Skip to content

Commit d0d2276

Browse files
chore: PR Feedback
1 parent b1b98bd commit d0d2276

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

clang/lib/AST/ExprConstant.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11621,9 +11621,8 @@ static bool evalPackBuiltin(const CallExpr *E, EvalInfo &Info, APValue &Result,
1162111621

1162211622
static bool evalShuffleGeneric(
1162311623
EvalInfo &Info, const CallExpr *Call, APValue &Out,
11624-
llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)>
11625-
GetSourceIndex,
11626-
llvm::function_ref<bool(unsigned, unsigned)> ShouldZero = nullptr) {
11624+
llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>
11625+
GetSourceIndex) {
1162711626

1162811627
const auto *VT = Call->getType()->getAs<VectorType>();
1162911628
if (!VT)
@@ -11644,13 +11643,14 @@ static bool evalShuffleGeneric(
1164411643
ResultElements.reserve(NumElts);
1164511644

1164611645
for (unsigned DstIdx = 0; DstIdx != NumElts; ++DstIdx) {
11647-
if (ShouldZero && ShouldZero(DstIdx, ShuffleMask)) {
11646+
auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask);
11647+
11648+
if (SrcIdx < 0) {
1164811649
// Zero out this element
1164911650
QualType ElemTy = VT->getElementType();
1165011651
ResultElements.push_back(
1165111652
APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy))));
1165211653
} else {
11653-
auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask);
1165411654
const APValue &Src = (SrcVecIdx == 0) ? A : B;
1165511655
ResultElements.push_back(Src.getVectorElt(SrcIdx));
1165611656
}
@@ -12446,7 +12446,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1244612446
if (!evalShuffleGeneric(
1244712447
Info, E, R,
1244812448
[](unsigned DstIdx,
12449-
unsigned ShuffleMask) -> std::pair<unsigned, unsigned> {
12449+
unsigned ShuffleMask) -> std::pair<unsigned, int> {
1245012450
constexpr unsigned LaneBits = 128u;
1245112451
unsigned NumElemPerLane = LaneBits / 32;
1245212452
unsigned NumSelectableElems = NumElemPerLane / 2;
@@ -12459,7 +12459,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1245912459
unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
1246012460
unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;
1246112461
unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
12462-
return {SrcIdx, LaneOffset + Index};
12462+
return {SrcIdx, static_cast<int>(LaneOffset + Index)};
1246312463
}))
1246412464
return false;
1246512465
return Success(R, E);
@@ -12471,7 +12471,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1247112471
if (!evalShuffleGeneric(
1247212472
Info, E, R,
1247312473
[](unsigned DstIdx,
12474-
unsigned ShuffleMask) -> std::pair<unsigned, unsigned> {
12474+
unsigned ShuffleMask) -> std::pair<unsigned, int> {
1247512475
constexpr unsigned LaneBits = 128u;
1247612476
unsigned NumElemPerLane = LaneBits / 64;
1247712477
unsigned NumSelectableElems = NumElemPerLane / 2;
@@ -12484,7 +12484,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1248412484
unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;
1248512485
unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;
1248612486
unsigned Index = (ShuffleMask >> BitIndex) & IndexMask;
12487-
return {SrcIdx, LaneOffset + Index};
12487+
return {SrcIdx, static_cast<int>(LaneOffset + Index)};
1248812488
}))
1248912489
return false;
1249012490
return Success(R, E);
@@ -12493,23 +12493,22 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1249312493
APValue R;
1249412494
if (!evalShuffleGeneric(
1249512495
Info, E, R,
12496-
[](unsigned DstIdx,
12497-
unsigned Mask) -> std::pair<unsigned, unsigned> {
12496+
[](unsigned DstIdx, unsigned Mask) -> std::pair<unsigned, int> {
12497+
// Bits [3:0]: zero mask - if bit is set, zero this element
12498+
if ((Mask & (1 << DstIdx)) != 0) {
12499+
return {0, -1};
12500+
}
1249812501
// Bits [7:6]: select element from source vector Y (0-3)
1249912502
// Bits [5:4]: select destination position (0-3)
1250012503
unsigned SrcElem = (Mask >> 6) & 0x3;
1250112504
unsigned DstElem = (Mask >> 4) & 0x3;
1250212505
if (DstIdx == DstElem) {
1250312506
// Insert element from source vector (B) at this position
12504-
return {1, SrcElem};
12507+
return {1, static_cast<int>(SrcElem)};
1250512508
} else {
1250612509
// Copy from destination vector (A)
12507-
return {0, DstIdx};
12510+
return {0, static_cast<int>(DstIdx)};
1250812511
}
12509-
},
12510-
[](unsigned DstIdx, unsigned Mask) -> bool {
12511-
// Bits [3:0]: zero mask
12512-
return (Mask & (1 << DstIdx)) != 0;
1251312512
}))
1251412513
return false;
1251512514
return Success(R, E);

0 commit comments

Comments
 (0)