]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR target/105930: Split *xordi3_doubleword after reload on x86.
authorRoger Sayle <roger@nextmovesoftware.com>
Sat, 9 Jul 2022 11:38:12 +0000 (12:38 +0100)
committerRoger Sayle <roger@nextmovesoftware.com>
Sat, 9 Jul 2022 11:38:12 +0000 (12:38 +0100)
This is a backport of the fix for PR target/105930 from mainline to the
gcc12 release branch.

2022-07-09  Roger Sayle  <roger@nextmovesoftware.com>
    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
PR target/105930
* config/i386/i386.md (*<any_or>di3_doubleword): Split after
reload.  Use rtx_equal_p to avoid creating memory-to-memory moves,
and emit NOTE_INSN_DELETED if operand[2] is zero (i.e. with -O0).

gcc/config/i386/i386.md

index 7c9560fc4f0d2946d322c7e0ab7853b53b79afa1..1c4781d26f789d3875d404b8f8b638b3cc186f09 100644 (file)
   "ix86_expand_binary_operator (<CODE>, <MODE>mode, operands); DONE;")
 
 (define_insn_and_split "*<code>di3_doubleword"
-  [(set (match_operand:DI 0 "nonimmediate_operand")
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=ro,r")
        (any_or:DI
-        (match_operand:DI 1 "nonimmediate_operand")
-        (match_operand:DI 2 "x86_64_szext_general_operand")))
+        (match_operand:DI 1 "nonimmediate_operand" "0,0")
+        (match_operand:DI 2 "x86_64_szext_general_operand" "re,o")))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT
-   && ix86_binary_operator_ok (<CODE>, DImode, operands)
-   && ix86_pre_reload_split ()"
+   && ix86_binary_operator_ok (<CODE>, DImode, operands)"
   "#"
-  "&& 1"
+  "&& reload_completed"
   [(const_int 0)]
 {
+  /* This insn may disappear completely when operands[2] == const0_rtx
+     and operands[0] == operands[1], which requires a NOTE_INSN_DELETED.  */
+  bool emit_insn_deleted_note_p = false;
+
   split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
 
   if (operands[2] == const0_rtx)
-    emit_move_insn (operands[0], operands[1]);
+    emit_insn_deleted_note_p = true;
   else if (operands[2] == constm1_rtx)
     {
       if (<CODE> == IOR)
     ix86_expand_binary_operator (<CODE>, SImode, &operands[0]);
 
   if (operands[5] == const0_rtx)
-    emit_move_insn (operands[3], operands[4]);
+    {
+      if (emit_insn_deleted_note_p)
+       emit_note (NOTE_INSN_DELETED);
+    }
   else if (operands[5] == constm1_rtx)
     {
       if (<CODE> == IOR)