[clang] Fix signedness in vector bitcast evaluation

The included test case triggered a sign assertion on the result in
`Success()`.  This was caused by the APSInt created for a bitcast
having its signedness bit inverted.  The second APSInt constructor
argument is `isUnsigned`, so invert the result of
`isSignedIntegerType`.

Relanding this patch after reverting.  The test case had to be updated
to be insensitive to 32/64-bit extractelement indices.

Differential Revision: https://reviews.llvm.org/D95135
This commit is contained in:
Sven van Haastregt 2021-01-27 09:30:26 +00:00
parent 7cd420649f
commit 79c727328b
2 changed files with 8 additions and 1 deletions

View File

@ -10193,7 +10193,7 @@ bool VectorExprEvaluator::VisitCastExpr(const CastExpr *E) {
Elt = SValInt.rotl(i*EltSize+EltSize).zextOrTrunc(EltSize);
else
Elt = SValInt.rotr(i*EltSize).zextOrTrunc(EltSize);
Elts.push_back(APValue(APSInt(Elt, EltTy->isSignedIntegerType())));
Elts.push_back(APValue(APSInt(Elt, !EltTy->isSignedIntegerType())));
}
} else {
return Error(E);

View File

@ -63,3 +63,10 @@ void vector_literals_valid() {
//CHECK: store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %V2
float4 V2 = (float4)(1);
}
void vector_literals_with_cast() {
// CHECK-LABEL: vector_literals_with_cast
// CHECK: store <2 x i32> <i32 12, i32 34>, <2 x i32>*
// CHECK: extractelement <2 x i32> %{{[0-9]+}}, i{{[0-9]+}} 0
unsigned int withCast = ((int2)((int2)(12, 34))).s0;
}