[gcc r16-6742] forwprop: Fix type mismatch in vec constructor [PR123525].
Robin Dapp
rdapp@gcc.gnu.org
Tue Jan 13 11:53:24 GMT 2026
https://gcc.gnu.org/g:939dd2324e0f1c7cac49d2635532f08762b67674
commit r16-6742-g939dd2324e0f1c7cac49d2635532f08762b67674
Author: Robin Dapp <rdapp@oss.qualcomm.com>
Date: Mon Jan 12 15:45:46 2026 +0100
forwprop: Fix type mismatch in vec constructor [PR123525].
This issue got raised after r16-6671 in which I removed checks for
number-of-element equality. In the splat case with conversion:
vector(16) int w;
vector(8) long int v;
_13 = BIT_FIELD_REF <w_12(D), 32, 160>;
_2 = (long int) _13;
_3 = (long int) _13;
...
_9 = (long int) _13;
_1 = {_2, _3, _4, _5, _6, _7, _8, _9};
right now we do
_16 = VEC_PERM_EXPR <w_12(D), w_12(D), { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }>;
_17 = VIEW_CONVERT_EXPR<vector(8) intD.6>(_16);
where the view convert is actually an optimized
_17 = BIT_FIELD_REF (_16, 512, 0);
512 is the size of the unconverted source but we should actually use the
converted source type. That's what this patch does.
PR tree-optimization/123525
gcc/ChangeLog:
* tree-ssa-forwprop.cc (simplify_vector_constructor): Use
converted source type for conversion bit field ref.
gcc/testsuite/ChangeLog:
* gcc.dg/vect/pr123525.c: New test.
* g++.dg/vect/pr123525-2.cc: New test.
Diff:
---
gcc/testsuite/g++.dg/vect/pr123525-2.cc | 38 +++++++++++++++++++++++++++++++++
gcc/testsuite/gcc.dg/vect/pr123525.c | 14 ++++++++++++
gcc/tree-ssa-forwprop.cc | 5 ++++-
3 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/gcc/testsuite/g++.dg/vect/pr123525-2.cc b/gcc/testsuite/g++.dg/vect/pr123525-2.cc
new file mode 100644
index 000000000000..4dbe0f1218d5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr123525-2.cc
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-march=tigerlake -std=c++23" { target { x86_64-*-* i?86-*-* } } } */
+/* { dg-additional-options "-std=c++23" } */
+
+short ScAddress_nTabP;
+struct ScAddress {
+ short nCol;
+ short nTab;
+ ScAddress(short nColP) : nCol(nColP), nTab(ScAddress_nTabP) {}
+};
+
+struct ScRange {
+ ScAddress aStart;
+};
+
+struct CellRangeAddress {
+ int StartColumn;
+ int StartRow;
+ int EndColumn;
+ int EndRow;
+};
+
+struct ScCellRangeObj {
+ ScCellRangeObj(int, ScRange &);
+};
+
+CellRangeAddress ScVbaRangeMergeArea_aCellAddress;
+void ScVbaRangeMergeArea() {
+ if (ScVbaRangeMergeArea_aCellAddress.StartColumn == 0 &&
+ ScVbaRangeMergeArea_aCellAddress.EndColumn == 0 &&
+ ScVbaRangeMergeArea_aCellAddress.StartRow == 0 &&
+ ScVbaRangeMergeArea_aCellAddress.EndRow == 0)
+ ;
+ else {
+ ScRange refRange(ScVbaRangeMergeArea_aCellAddress.StartColumn);
+ ScCellRangeObj(0, refRange);
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr123525.c b/gcc/testsuite/gcc.dg/vect/pr123525.c
new file mode 100644
index 000000000000..e00f465e6d73
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr123525.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx512f" { target { x86_64-*-* i?86-*-* } } } */
+/* { dg-additional-options "-Wno-psabi" } */
+
+typedef __attribute__((__vector_size__(64))) long V;
+typedef __attribute__((__vector_size__(64))) int W;
+
+V v;
+
+V
+foo(W w)
+{
+ return w[5] > v;
+}
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index b70fe8169adc..bdc63a7a71bc 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -4260,7 +4260,10 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
if (nelts != refnelts)
res = gimple_build (&stmts, BIT_FIELD_REF,
conv_code != ERROR_MARK ? conv_src_type : type,
- res, TYPE_SIZE (type), bitsize_zero_node);
+ res,
+ TYPE_SIZE (conv_code != ERROR_MARK ? conv_src_type
+ : type),
+ bitsize_zero_node);
if (conv_code != ERROR_MARK)
res = gimple_build (&stmts, conv_code, type, res);
else if (!useless_type_conversion_p (type, TREE_TYPE (res)))
More information about the Gcc-cvs
mailing list