Range checks were not properly performed in the lane arguments of Neon
intrinsics implemented based on splat operations. Calls to those
intrinsics where translated to __builtin__shufflevector calls directly
by the pre-processor through the arm_neon.h macros, missing the chance
for the proper range checks.
This patch enables the range check by introducing an auxiliary splat
instruction in arm_neon.td, delaying the translation to shufflevector
calls to CGBuiltin.cpp in clang after the checks were performed.
clang-format: please reformat the code
-Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C, unsigned NumElements) { - Value* SV = llvm::ConstantVector::getSplat(NumElements, C); +Value *CodeGenFunction::EmitNeonSplat(Value *V, Constant *C, + unsigned NumElements) { + Value *SV = llvm::ConstantVector::getSplat(NumElements, C);