middle-end: Remove truly_noop_truncation check from convert.c
authorRoger Sayle <roger@nextmovesoftware.com>
Mon, 13 Jul 2020 08:49:34 +0000 (09:49 +0100)
committerRoger Sayle <roger@nextmovesoftware.com>
Mon, 13 Jul 2020 08:49:34 +0000 (09:49 +0100)
This patch eliminates a check of targetm.truly_noop_truncation from
the early middle-end, where the gimple/generic being generated by
GCC's front-ends is being inappropriately influenced by the target's
TRULY_NOOP_TRUNCATION.  The (recent) intention of TRULY_NOOP_TRUNCATION
is to indicate that a backend requires explicit truncation instructions
rather than using SUBREGs to perform truncations.  A long standing
(and probably unintentional) side-effect has been that this setting
also controls whether the middle-end narrows integer operations at
the tree-level.  Understandably, GCC and its testsuite assume that
GIMPLE and GENERIC behave consistently across platforms, and alas
defining TRULY_NOOP_TRUNCATION away from the default triggers several
regressions (including gcc.dg/fold-rotate-1.c).

2020-07-13  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
* convert.c (convert_to_integer_1): Narrow integer operations
even on targets that require explicit truncation instructions.

gcc/convert.c

index 42509c518a9a276d9e3672ac730464d1e5e48256..292c5133974ac9242d76a083b8dfd7ba85f78edd 100644 (file)
@@ -836,16 +836,10 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
                  && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0))))
                break;
 
-             if (outprec >= BITS_PER_WORD
-                 || targetm.truly_noop_truncation (outprec, inprec)
-                 || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
-                 || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
-               {
-                 tree tem = do_narrow (loc, ex_form, type, arg0, arg1,
-                                       expr, inprec, outprec, dofold);
-                 if (tem)
-                   return tem;
-               }
+             tree tem = do_narrow (loc, ex_form, type, arg0, arg1,
+                                   expr, inprec, outprec, dofold);
+             if (tem)
+               return tem;
            }
            break;