Hi,
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.
Bootstrapped and regtested on x86, power10, aarch64 still running.
Regtested on riscv64.
Regards
Robin
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.
---
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(-)
create mode 100644 gcc/testsuite/g++.dg/vect/pr123525-2.cc
create mode 100644 gcc/testsuite/gcc.dg/vect/pr123525.c
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 00000000000..4dbe0f1218d
--- /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 00000000000..e00f465e6d7
--- /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 b70fe8169ad..bdc63a7a71b 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)))
--
2.52.0