i386: Add a variant peephole for lea rather than ops that clobber CC.
authorBernd Schmidt <bernds@redhat.com>
Tue, 26 Apr 2016 12:57:50 +0000 (12:57 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 26 Apr 2016 12:57:50 +0000 (12:57 +0000)
* config/i386/i386.md (operation on memory peephole): Duplicate an
existing peephole and adapt it to match lea rather than an operation
that clobbers CC.

From-SVN: r235443

gcc/ChangeLog
gcc/config/i386/i386.md

index f439345..5dc4c74 100644 (file)
@@ -1,5 +1,9 @@
 2016-04-26  Bernd Schmidt  <bschmidt@redhat.com>
 
+       * config/i386/i386.md (operation on memory peephole): Duplicate an
+       existing peephole and adapt it to match lea rather than an operation
+       that clobbers CC.
+
        PR rtl-optimization/57193
        * opts.c (default_options_table): Add OPT_frename_registers at -O2
        and above.
index b1f8461..30764c9 100644 (file)
                                 operands[5], const0_rtx);
 })
 
+;; Likewise for instances where we have a lea pattern.
+(define_peephole2
+  [(set (match_operand:SWI 0 "register_operand")
+       (match_operand:SWI 1 "memory_operand"))
+   (set (match_operand:SWI 3 "register_operand")
+       (plus (match_dup 0)
+             (match_operand:SWI 2 "<nonmemory_operand>")))
+   (set (match_dup 1) (match_dup 3))
+   (set (reg FLAGS_REG) (compare (match_dup 3) (const_int 0)))]
+  "(TARGET_READ_MODIFY_WRITE || optimize_insn_for_size_p ())
+   && peep2_reg_dead_p (4, operands[3])
+   && (rtx_equal_p (operands[0], operands[3])
+       || peep2_reg_dead_p (2, operands[0]))
+   && !reg_overlap_mentioned_p (operands[0], operands[1])
+   && !reg_overlap_mentioned_p (operands[3], operands[1])
+   && !reg_overlap_mentioned_p (operands[0], operands[2])
+   && (<MODE>mode != QImode
+       || immediate_operand (operands[2], QImode)
+       || any_QIreg_operand (operands[2], QImode))
+   && ix86_match_ccmode (peep2_next_insn (3), CCGOCmode)"
+  [(parallel [(set (match_dup 4) (match_dup 5))
+             (set (match_dup 1) (plus:SWI (match_dup 1)
+                                          (match_dup 2)))])]
+{
+  operands[4] = SET_DEST (PATTERN (peep2_next_insn (3)));
+  operands[5] = gen_rtx_PLUS (<MODE>mode,
+                             copy_rtx (operands[1]),
+                             copy_rtx (operands[2]));
+  operands[5] = gen_rtx_COMPARE (GET_MODE (operands[4]),
+                                operands[5], const0_rtx);
+})
+
 (define_peephole2
   [(parallel [(set (match_operand:SWI 0 "register_operand")
                   (match_operator:SWI 2 "plusminuslogic_operator"