wsehjk wrote: In the `builtinshufflevetor2.c` test ```c++ // CHECK-LABEL: define {{.*}}void @clang_shufflevector_v_v( void clang_shufflevector_v_v( float4* A, float4 x, uint4 mask ) { // CHECK: [[MASK:%.*]] = and <4 x i32> {{%.*}}, splat (i32 3) // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i{{[0-9]+}} 0 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X:%.*]], i{{[0-9]+}} [[I]] // // Here is where ToT Clang code generation makes a mistake. // It uses [[I]] as the insertion index instead of 0. // Similarly on the remaining insertelement. // CHECK: [[V:%[a-zA-Z0-9._]+]] = insertelement <4 x float> poison, float [[E]], i{{[0-9]+}} 0
// CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i{{[0-9]+}} 1 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i{{[0-9]+}} [[I]] // CHECK: [[V2:%.*]] = insertelement <4 x float> [[V]], float [[E]], i{{[0-9]+}} 1 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i{{[0-9]+}} 2 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i{{[0-9]+}} [[I]] // CHECK: [[V3:%.*]] = insertelement <4 x float> [[V2]], float [[E]], i{{[0-9]+}} 2 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i{{[0-9]+}} 3 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i{{[0-9]+}} [[I]] // CHECK: [[V4:%.*]] = insertelement <4 x float> [[V3]], float [[E]], i{{[0-9]+}} 3 // CHECK: store <4 x float> [[V4]], ptr {{%.*}}, *A = __builtin_shufflevector( x, mask ); } ``` The code will return from `EvaluateAsRValue` in `VectorExprEvaluator::VisitShuffleVectorExpr`. So `handleVectorShuffle` will not be called, which will call `getShuffleMaskIdx`. ```c++ bool VectorExprEvaluator::VisitShuffleVectorExpr(const ShuffleVectorExpr *E) { llvm::dbgs() << "VectorExprEvaluator::VisitShuffleVectorExpr called\n" ; APValue VecVal1; const Expr *Vec1 = E->getExpr(0); if (!EvaluateAsRValue(Info, Vec1, VecVal1)) return false; APValue VecVal2; const Expr *Vec2 = E->getExpr(1); if (!EvaluateAsRValue(Info, Vec2, VecVal2)) return false; VectorType const *DestVecTy = E->getType()->castAs<VectorType>(); QualType DestElTy = DestVecTy->getElementType(); auto TotalElementsInOutputVector = DestVecTy->getNumElements(); llvm::dbgs() << "TotalElementsInOutputVector is " << TotalElementsInOutputVector << "\n"; SmallVector<APValue, 4> ResultElements; ResultElements.reserve(TotalElementsInOutputVector); for (unsigned EltNum = 0; EltNum < TotalElementsInOutputVector; ++EltNum) { APValue Elt; if (!handleVectorShuffle(Info, E, DestElTy, VecVal1, VecVal2, EltNum, Elt)) return false; ResultElements.push_back(std::move(Elt)); } return Success(APValue(ResultElements.data(), ResultElements.size()), E); } ``` So before the change, these failed tests passed. https://github.com/llvm/llvm-project/pull/130400 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits