aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-01-17 13:55:50 +0100
committerJakub Jelinek <jakub@redhat.com>2024-01-17 13:55:50 +0100
commit2fb78d431ff3c05997ef31837d6eb319d84a4239 (patch)
treeea3fa4e0f113e7c5dac39b1ee08fc75ad126f5fe
parent2c74d5c0a0f21ae1d0c195ca0d81a3d1032f27e3 (diff)
downloadgcc-2fb78d431ff3c05997ef31837d6eb319d84a4239.zip
gcc-2fb78d431ff3c05997ef31837d6eb319d84a4239.tar.gz
gcc-2fb78d431ff3c05997ef31837d6eb319d84a4239.tar.bz2
lower-bitint: Fix up VIEW_CONVERT_EXPR handling [PR113408]
Unlike NOP_EXPR/CONVERT_EXPR which are GIMPLE_UNARY_RHS, VIEW_CONVERT_EXPR is GIMPLE_SINGLE_RHS and so gimple_assign_rhs1 contains the operand wrapped in VIEW_CONVERT_EXPR tree. So, to handle it like other casts we need to look through it. 2024-01-17 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/113408 * gimple-lower-bitint.cc (bitint_large_huge::handle_stmt): For VIEW_CONVERT_EXPR, pass TREE_OPERAND (rhs1, 0) rather than rhs1 to handle_cast. * gcc.dg/bitint-71.c: New test.
-rw-r--r--gcc/gimple-lower-bitint.cc5
-rw-r--r--gcc/testsuite/gcc.dg/bitint-71.c18
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 672a9a3..d3d1135 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -1975,9 +1975,12 @@ bitint_large_huge::handle_stmt (gimple *stmt, tree idx)
case INTEGER_CST:
return handle_operand (gimple_assign_rhs1 (stmt), idx);
CASE_CONVERT:
- case VIEW_CONVERT_EXPR:
return handle_cast (TREE_TYPE (gimple_assign_lhs (stmt)),
gimple_assign_rhs1 (stmt), idx);
+ case VIEW_CONVERT_EXPR:
+ return handle_cast (TREE_TYPE (gimple_assign_lhs (stmt)),
+ TREE_OPERAND (gimple_assign_rhs1 (stmt), 0),
+ idx);
default:
break;
}
diff --git a/gcc/testsuite/gcc.dg/bitint-71.c b/gcc/testsuite/gcc.dg/bitint-71.c
new file mode 100644
index 0000000..f7ff871
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-71.c
@@ -0,0 +1,18 @@
+/* PR tree-optimization/113408 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=c23 -O2" } */
+
+#if __BITINT_MAXWIDTH__ >= 713
+struct A { _BitInt(713) b; } g;
+#else
+struct A { _BitInt(49) b; } g;
+#endif
+int f;
+
+void
+foo (void)
+{
+ struct A j = g;
+ if (j.b)
+ f = 0;
+}