[llvm-branch-commits] [clang] 14947cd - [clang] Fix signedness in vector bitcast evaluation
Sven van Haastregt via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jan 25 04:05:56 PST 2021
Author: Sven van Haastregt
Date: 2021-01-25T12:01:42Z
New Revision: 14947cd04701d923a57a0161fd1967b81e00ff5e
URL: https://github.com/llvm/llvm-project/commit/14947cd04701d923a57a0161fd1967b81e00ff5e
DIFF: https://github.com/llvm/llvm-project/commit/14947cd04701d923a57a0161fd1967b81e00ff5e.diff
LOG: [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`.
Differential Revision: https://reviews.llvm.org/D95135
Added:
Modified:
clang/lib/AST/ExprConstant.cpp
clang/test/CodeGenOpenCL/vector_literals.cl
Removed:
################################################################################
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 56181bbe1166..c1973720e49a 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -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);
diff --git a/clang/test/CodeGenOpenCL/vector_literals.cl b/clang/test/CodeGenOpenCL/vector_literals.cl
index af571714368e..3115aef2b50a 100644
--- a/clang/test/CodeGenOpenCL/vector_literals.cl
+++ b/clang/test/CodeGenOpenCL/vector_literals.cl
@@ -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]+}}, i64 0
+ unsigned int withCast = ((int2)((int2)(12, 34))).s0;
+}
More information about the llvm-branch-commits
mailing list