aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-01-19 10:00:51 +0100
committerJakub Jelinek <jakub@redhat.com>2024-01-19 10:00:51 +0100
commitdf1cd90e32bb17d34f5fdce99bd0377fe1b8e5c6 (patch)
tree9e4dc9b678460d4d93533666115157e9e139b2a6 /gcc
parentdcd5601c2b7298155c9a8e1bfb93ee8e952eca0b (diff)
downloadgcc-df1cd90e32bb17d34f5fdce99bd0377fe1b8e5c6.zip
gcc-df1cd90e32bb17d34f5fdce99bd0377fe1b8e5c6.tar.gz
gcc-df1cd90e32bb17d34f5fdce99bd0377fe1b8e5c6.tar.bz2
gimple-ssa-warn-restrict: Only use type range from NOP_EXPR for non-narrowing conversions [PR113463]
builtin_memref::extend_offset_range when it sees a NOP_EXPR from INTEGRAL_TYPE (to INTEGRAL_TYPE of sizetype/ptrdifftype precision given the callers) uses wi::to_offset on TYPE_{MIN,MAX}_VALUE of the rhs1 type. This ICEs with large BITINT_TYPEs - to_offset is only supported for precisions up to the offset_int precision - but it even doesn't make any sense to do such thing for narrowing conversions, their range means the whole sizetype/ptrdifftype range and so the normal handling done later on (largest sized supported object) is the way to go in that case. So, the following patch just restrict this to non-narrowing conversions. 2024-01-19 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/113463 * gimple-ssa-warn-restrict.cc (builtin_memref::extend_offset_range): Only look through NOP_EXPRs if rhs1 doesn't have wider type than lhs. * gcc.dg/bitint-74.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-ssa-warn-restrict.cc3
-rw-r--r--gcc/testsuite/gcc.dg/bitint-74.c16
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/gimple-ssa-warn-restrict.cc b/gcc/gimple-ssa-warn-restrict.cc
index dacb3b1..a552ce8 100644
--- a/gcc/gimple-ssa-warn-restrict.cc
+++ b/gcc/gimple-ssa-warn-restrict.cc
@@ -391,7 +391,8 @@ builtin_memref::extend_offset_range (tree offset)
tree type;
if (is_gimple_assign (stmt)
&& (type = TREE_TYPE (gimple_assign_rhs1 (stmt)))
- && INTEGRAL_TYPE_P (type))
+ && INTEGRAL_TYPE_P (type)
+ && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (offset)))
{
tree_code code = gimple_assign_rhs_code (stmt);
if (code == NOP_EXPR)
diff --git a/gcc/testsuite/gcc.dg/bitint-74.c b/gcc/testsuite/gcc.dg/bitint-74.c
new file mode 100644
index 0000000..9114332
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/bitint-74.c
@@ -0,0 +1,16 @@
+/* PR tree-optimization/113463 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=c23 -O2" } */
+
+extern char *a, *b;
+#if __BITINT_MAXWIDTH__ >= 129
+_BitInt(129) o;
+#else
+_BitInt(63) o;
+#endif
+
+void
+foo (void)
+{
+ __builtin_memcpy (a + o, b, 4);
+}