[clang] 859d923 - Fix a failing assertion with vector type initialization
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Wed May 4 10:25:42 PDT 2022
Author: Aaron Ballman
Date: 2022-05-04T13:25:21-04:00
New Revision: 859d92394812c0e5e650ab337717719b9687e5ce
URL: https://github.com/llvm/llvm-project/commit/859d92394812c0e5e650ab337717719b9687e5ce
DIFF: https://github.com/llvm/llvm-project/commit/859d92394812c0e5e650ab337717719b9687e5ce.diff
LOG: Fix a failing assertion with vector type initialization
When constant evaluating the initializer for an object of vector type,
we would call APInt::trunc() but truncate to the same bit-width the
object already had, which would cause an assertion. Instead, use
APInt::truncOrSelf() so that we no longer assert in this situation.
Fix #50216
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/ExprConstant.cpp
clang/test/Sema/vector-init.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 079523a07361e..3187dad2b729e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -132,6 +132,10 @@ Bug Fixes
argument to a generic selection expression has side effects in the case where
the expression is result dependent. This fixes
`Issue 50227 <https://github.com/llvm/llvm-project/issues/50227>`_.
+- Fixed an assertion when constant evaluating an initializer for a GCC/Clang
+ floating-point vector type when the width of the initialization is exactly
+ the same as the elements of the vector being initialized.
+ Fixes `Issue 50216 <https://github.com/llvm/llvm-project/issues/50216>`_.
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 70a1e0bbd91aa..650ba305c48b1 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -10353,9 +10353,9 @@ bool VectorExprEvaluator::VisitCastExpr(const CastExpr *E) {
for (unsigned i = 0; i < NElts; i++) {
llvm::APInt Elt;
if (BigEndian)
- Elt = SValInt.rotl(i*EltSize+FloatEltSize).trunc(FloatEltSize);
+ Elt = SValInt.rotl(i*EltSize+FloatEltSize).truncOrSelf(FloatEltSize);
else
- Elt = SValInt.rotr(i*EltSize).trunc(FloatEltSize);
+ Elt = SValInt.rotr(i*EltSize).truncOrSelf(FloatEltSize);
Elts.push_back(APValue(APFloat(Sem, Elt)));
}
} else if (EltTy->isIntegerType()) {
diff --git a/clang/test/Sema/vector-init.c b/clang/test/Sema/vector-init.c
index c7c278f96368f..554e976892636 100644
--- a/clang/test/Sema/vector-init.c
+++ b/clang/test/Sema/vector-init.c
@@ -42,3 +42,11 @@ void test3(void) {
longlong2 arr1[2] = { test3_helper(), test3_helper() };
short4 arr2[2] = { test3_helper(), test3_helper() }; // expected-error 2 {{initializing 'short4' (vector of 4 'short' values) with an expression of incompatible type 'short8' (vector of 8 'short' values)}}
}
+
+// GH50216
+// These would previously crash when constant evaluating the initializers.
+typedef double float64x1_t __attribute__((vector_size(8)));
+float64x1_t arg1 = (float64x1_t)0x3fedf9d4343c7c80; // okay
+
+typedef float float32x1_t __attribute__((vector_size(4)));
+float32x1_t arg2 = (float32x1_t)0x3fedf9d4; // okay
More information about the cfe-commits
mailing list