aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-06-19 21:10:39 +0200
committerJakub Jelinek <jakub@redhat.com>2024-06-19 21:10:39 +0200
commit25860fd2a674373a6476af5ff0bd92354fc53d06 (patch)
tree4b8130fcaa4354df657b698f1edf2d6db0616d41
parent6f6ea27d17e9bbc917b94ffea1c933755e736bdc (diff)
downloadgcc-25860fd2a674373a6476af5ff0bd92354fc53d06.zip
gcc-25860fd2a674373a6476af5ff0bd92354fc53d06.tar.gz
gcc-25860fd2a674373a6476af5ff0bd92354fc53d06.tar.bz2
bitint: Fix up lowering of COMPLEX_EXPR [PR115544]
We don't really support _Complex _BitInt(N), the only place we use bitint complex types is for the .{ADD,SUB,MUL}_OVERFLOW internal function results and COMPLEX_EXPR in the usual case should be either not present yet because the ifns weren't folded and will be lowered, or optimized into something simpler, because normally the complex bitint should be used just for extracting the 2 subparts from it. Still, with disabled optimizations it can occassionally happen that it appears in the IL and that is why there is support for lowering those, but it doesn't handle optimizing those too much, so if it uses SSA_NAME, it relies on them having a backing VAR_DECL during the lowering. This is normally achieves through the && ((is_gimple_assign (use_stmt) && (gimple_assign_rhs_code (use_stmt) != COMPLEX_EXPR)) || gimple_code (use_stmt) == GIMPLE_COND) hunk in gimple_lower_bitint, but as the following testcase shows, there is one thing I've missed, the load optimization isn't guarded by the above stuff. So, either we'd need to add support for loads to lower_complexexpr_stmt, or because they should be really rare, this patch just disables the load optimization if at least one load use is a COMPLEX_EXPR (like we do already for PHIs, calls, asm). 2024-06-19 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/115544 * gimple-lower-bitint.cc (gimple_lower_bitint): Disable optimizing loads used by COMPLEX_EXPR operands. * gcc.dg/bitint-107.c: New test.
-rw-r--r--gcc/gimple-lower-bitint.cc5
-rw-r--r--gcc/testsuite/gcc.dg/bitint-107.c16
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/gimple-lower-bitint.cc b/gcc/gimple-lower-bitint.cc
index 56e5f82..f955f3e 100644
--- a/gcc/gimple-lower-bitint.cc
+++ b/gcc/gimple-lower-bitint.cc
@@ -6630,7 +6630,10 @@ gimple_lower_bitint (void)
continue;
if (gimple_code (use_stmt) == GIMPLE_PHI
|| is_gimple_call (use_stmt)
- || gimple_code (use_stmt) == GIMPLE_ASM)
+ || gimple_code (use_stmt) == GIMPLE_ASM
+ || (is_gimple_assign (use_stmt)
+ && (gimple_assign_rhs_code (use_stmt)
+ == COMPLEX_EXPR)))
{
optimizable_load = false;
break;
diff --git a/gcc/testsuite/gcc.dg/bitint-107.c b/gcc/testsuite/gcc.dg/bitint-107.c
new file mode 100644
index 0000000..a3f5f53
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-107.c
@@ -0,0 +1,16 @@
+/* PR tree-optimization/115544 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-O -fno-tree-fre -fno-tree-ccp -fno-tree-forwprop" } */
+
+#if __BITINT_MAXWIDTH__ >= 129
+typedef _BitInt(129) B;
+#else
+typedef _BitInt(63) B;
+#endif
+B a, b;
+
+int
+foo (void)
+{
+ return __builtin_mul_overflow (a, 1, &b);
+}