]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimple-ssa-warn-restrict: Only use type range from NOP_EXPR for non-narrowing convers...
authorJakub Jelinek <jakub@redhat.com>
Fri, 19 Jan 2024 09:00:51 +0000 (10:00 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 19 Jan 2024 09:00:51 +0000 (10:00 +0100)
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.

gcc/gimple-ssa-warn-restrict.cc
gcc/testsuite/gcc.dg/bitint-74.c [new file with mode: 0644]

index dacb3b140bb52696438f18568a8064c52c5ae3a5..a552ce8dcdf6586b2ba78f851028d32c75b4ca12 100644 (file)
@@ -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 (file)
index 0000000..9114332
--- /dev/null
@@ -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);
+}