The tranform would be unsafe if !TRULY_NOOP_TRUNCATION because on these
machines the hardware may look at bits outside of the given mode.

gcc/ChangeLog:

        PR rtl-optimization/120050
        * ext-dce.cc (ext_dce_try_optimize_insn): Only transform the
        insn if TRULY_NOOP_TRUNCATION.
---

Bootstrapped on mips64el-linux-gnuabi64.  Ok for trunk and gcc-15?

 gcc/ext-dce.cc | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc
index a0343950141..4be4f8a007b 100644
--- a/gcc/ext-dce.cc
+++ b/gcc/ext-dce.cc
@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "print-rtl.h"
 #include "dbgcnt.h"
 #include "diagnostic-core.h"
+#include "target.h"
 
 /* These should probably move into a C++ class.  */
 static vec<bitmap_head> livein;
@@ -415,6 +416,13 @@ ext_dce_try_optimize_insn (rtx_insn *insn, rtx set)
       return;
     }
 
+  if (!TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner), GET_MODE (src)))
+    {
+      if (dump_file)
+       fprintf (dump_file, "The transformation is unsafe on this machine.\n");
+      return;
+    }
+
   new_pattern = simplify_gen_subreg (GET_MODE (src), inner,
                                     GET_MODE (inner), 0);
   /* simplify_gen_subreg may fail in which case NEW_PATTERN will be NULL.
-- 
2.49.0

Reply via email to