зеркало из https://github.com/microsoft/clang-1.git
Make __builtin_shufflevector and -ftrapv work correctly together. PR9945.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131611 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
493ff72fa7
Коммит
0eb47fc018
|
@ -758,19 +758,13 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
|
|||
Value* V2 = CGF.EmitScalarExpr(E->getExpr(1));
|
||||
|
||||
// Handle vec3 special since the index will be off by one for the RHS.
|
||||
const llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType());
|
||||
llvm::SmallVector<llvm::Constant*, 32> indices;
|
||||
for (unsigned i = 2; i < E->getNumSubExprs(); i++) {
|
||||
llvm::Constant *C = cast<llvm::Constant>(CGF.EmitScalarExpr(E->getExpr(i)));
|
||||
const llvm::VectorType *VTy = cast<llvm::VectorType>(V1->getType());
|
||||
if (VTy->getNumElements() == 3) {
|
||||
if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C)) {
|
||||
uint64_t cVal = CI->getZExtValue();
|
||||
if (cVal > 3) {
|
||||
C = llvm::ConstantInt::get(C->getType(), cVal-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
indices.push_back(C);
|
||||
unsigned Idx = E->getShuffleMaskIdx(CGF.getContext(), i-2);
|
||||
if (VTy->getNumElements() == 3 && Idx > 3)
|
||||
Idx -= 1;
|
||||
indices.push_back(Builder.getInt32(Idx));
|
||||
}
|
||||
|
||||
Value *SV = llvm::ConstantVector::get(indices);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// RUN: %clang_cc1 -emit-llvm < %s | grep 'shufflevector' | count 1
|
||||
// RUN: %clang_cc1 -emit-llvm -ftrapv < %s | grep 'shufflevector' | count 1
|
||||
typedef int v4si __attribute__ ((vector_size (16)));
|
||||
|
||||
v4si a(v4si x, v4si y) {return __builtin_shufflevector(x, y, 3, 2, 5, 7);}
|
||||
v4si a(v4si x, v4si y) {return __builtin_shufflevector(x, y, 3, 2, 5, (2*3)+1);}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче