On 07/02/2020 13:19, Christophe Lyon wrote:
When running the testsuite with -fdisable-rtl-fwprop2 and -mpure-code
for cortex-m0, I noticed that some testcases were failing because we
still generate "ldr rX, .LCY", which is what we want to avoid with
-mpure-code. This is latent since a recent improvement in fwprop
(PR88833).

In this patch I change the thumb1_movsi_insn pattern so that it emits
the desired instruction sequence when arm_disable_literal_pool is set.

I tried to add a define_split instead, but couldn't make it work: the
compiler then complains it cannot split the instruction, while my new
define_split accepts the same operand types as thumb1_movsi_insn:

c-c++-common/torture/complex-sign-mixed-add.c:41:1: error: could not split insn
(insn 2989 425 4844 (set (reg/f:SI 3 r3 [1342])
         (symbol_ref/u:SI ("*.LC6") [flags 0x2])) 836 {*thumb1_movsi_insn}
      (expr_list:REG_EQUIV (symbol_ref/u:SI ("*.LC6") [flags 0x2])
         (nil)))
during RTL pass: final

(define_split
   [(set (match_operand:SI 0 "register_operand" "")
         (match_operand:SI 1 "general_operand" ""))]
   "TARGET_THUMB1
    && arm_disable_literal_pool
    && GET_CODE (operands[1]) == SYMBOL_REF"
   [(clobber (const_int 0))]
   "
     gen_thumb1_movsi_symbol_ref(operands[0], operands[1]);
     DONE;
   "
)
and I put this in thumb1_movsi_insn:
if (GET_CODE (operands[1]) == SYMBOL_REF && arm_disable_literal_pool)
   {
     return \"#\";
   }
   return \"ldr\\t%0, %1\";

2020-02-07  Christophe Lyon  <christophe.l...@linaro.org>

         * config/arm/thumb1.md (thumb1_movsi_insn): Fix ldr alternative to
         work with -mpure-code.


+    case 0:
+    case 1:
+      return \"movs       %0, %1\";
+    case 2:
+      return \"movw       %0, %1\";

This is OK, but please replace the hard tab in the strings for MOVS/MOVW with \\t.

R.

Reply via email to