h8300.md (bsetqi_msx, [...]): Added condition to disallow non-identical memory locations.
authorKaushik Phatak <kaushik.phatak@kpitcummins.com>
Mon, 13 Jun 2011 09:31:41 +0000 (09:31 +0000)
committerKaushik Phatak <kaushikp@gcc.gnu.org>
Mon, 13 Jun 2011 09:31:41 +0000 (09:31 +0000)
* config/h8300/h8300.md (bsetqi_msx, bclrqi_msx, bnotqi_msx): Added
condition to disallow non-identical memory locations.
(*andqi3_2, andqi3_1, iorqi3_1, xorqi3_1): Reorder insn to give
preference to bit manipulation instructions.
* gcc.dg/h8300-bit-insn-ice2.2: New testcase.

From-SVN: r174986

gcc/ChangeLog
gcc/config/h8300/h8300.md
gcc/testsuite/gcc.dg/h8300-bit-insn-ice2.c [new file with mode: 0644]

index 5404f099f210b49e56037d3601a0492d739324f1..5d25bab88d92a05c4b37864d0aa2b9dde3c8c60e 100644 (file)
@@ -1,3 +1,11 @@
+2011-06-13  Kaushik Phatak <kaushik.phatak@kpitcummins.com>
+
+       * config/h8300/h8300.md (bsetqi_msx, bclrqi_msx, bnotqi_msx): Added 
+       condition to disallow non-identical memory locations.
+       (*andqi3_2, andqi3_1, iorqi3_1, xorqi3_1): Reorder insn to give
+       preference to bit manipulation instructions.
+       * gcc.dg/h8300-bit-insn-ice2.2: New testcase.
+
 2011-06-13  Jan Hubicka  <jh@suse.cz>
 
        * cgraph.c (cgraph_for_node_thunks_and_aliases,
index 4797460610e5a04846b486c941bc9025646978a5..db56e20cbbe436d63baadc9b795257faef196a0f 100644 (file)
   [(set (match_operand:QI 0 "bit_register_indirect_operand" "=WU")
        (and:QI (match_operand:QI 1 "bit_register_indirect_operand" "%0")
                (match_operand:QI 2 "single_zero_operand" "Y0")))]
-  "TARGET_H8300SX"
+  "TARGET_H8300SX
+   && rtx_equal_p(operands[0], operands[1])"
   "bclr\\t%W2,%0"
   [(set_attr "length" "8")])
 
   "TARGET_H8300SX"
   "bclr\\t%W2,%0"
   [(set_attr "length" "8")])
+
 (define_insn "*andqi3_2"
-  [(set (match_operand:QI 0 "bit_operand" "=rQ,r")
-       (and:QI (match_operand:QI 1 "bit_operand" "%0,WU")
-               (match_operand:QI 2 "h8300_src_operand" "rQi,IP1>X")))]
+  [(set (match_operand:QI 0 "bit_operand" "=U,rQ,r")
+       (and:QI (match_operand:QI 1 "bit_operand" "%0,0,WU")
+               (match_operand:QI 2 "h8300_src_operand" "Y0,rQi,IP1>X")))]
   "TARGET_H8300SX"
   "@
-   and %X2,%X0
-   bfld        %2,%1,%R0"
-  [(set_attr "length" "*,8")
-   (set_attr "length_table" "logicb,*")
-   (set_attr "cc" "set_znv,none_0hit")])
+   bclr\\t %W2,%R0
+   and  %X2,%X0
+   bfld %2,%1,%R0"
+  [(set_attr "length" "8,*,8")
+   (set_attr "length_table" "*,logicb,*")
+   (set_attr "cc" "none_0hit,set_znv,none_0hit")])
 
 (define_insn "andqi3_1"
-  [(set (match_operand:QI 0 "bit_operand" "=r,U")
+  [(set (match_operand:QI 0 "bit_operand" "=U,r")
        (and:QI (match_operand:QI 1 "bit_operand" "%0,0")
-               (match_operand:QI 2 "h8300_src_operand" "rn,n")))]
+               (match_operand:QI 2 "h8300_src_operand" "Y0,rn")))]
   "register_operand (operands[0], QImode)
    || single_zero_operand (operands[2], QImode)"
   "@
-   and %X2,%X0
-   bclr        %W2,%R0"
+   bclr %W2,%R0
+   and  %X2,%X0"
   [(set_attr "length" "2,8")
-   (set_attr "cc" "set_znv,none_0hit")])
+   (set_attr "cc" "none_0hit,set_znv")])
 
 (define_expand "andqi3"
   [(set (match_operand:QI 0 "register_operand" "")
 ;; ----------------------------------------------------------------------
 ;; OR INSTRUCTIONS
 ;; ----------------------------------------------------------------------
+
 (define_insn "bsetqi_msx"
   [(set (match_operand:QI 0 "bit_register_indirect_operand" "=WU")
        (ior:QI (match_operand:QI 1 "bit_register_indirect_operand" "%0")
                (match_operand:QI 2 "single_one_operand" "Y2")))]
-  "TARGET_H8300SX" 
+  "TARGET_H8300SX
+   && rtx_equal_p(operands[0], operands[1])"
   "bset\\t%V2,%0"
   [(set_attr "length" "8")])
 
   [(set_attr "length" "8")])
 
 (define_insn "iorqi3_1"
-  [(set (match_operand:QI 0 "bit_operand" "=rQ,U")
+  [(set (match_operand:QI 0 "bit_operand" "=U,rQ")
        (ior:QI (match_operand:QI 1 "bit_operand" "%0,0")
-               (match_operand:QI 2 "h8300_src_operand" "rQi,n")))]
+               (match_operand:QI 2 "h8300_src_operand" "Y2,rQi")))]
   "TARGET_H8300SX || register_operand (operands[0], QImode)
    || single_one_operand (operands[2], QImode)"
   "@
-   or\\t%X2,%X0
-   bset\\t%V2,%R0"
-  [(set_attr "length" "*,8")
-   (set_attr "length_table" "logicb,*")
-   (set_attr "cc" "set_znv,none_0hit")])
+   bset\\t%V2,%R0
+   or\\t%X2,%X0"
+  [(set_attr "length" "8,*")
+   (set_attr "length_table" "*,logicb")
+   (set_attr "cc" "none_0hit,set_znv")])
+
 
 (define_expand "iorqi3"
   [(set (match_operand:QI 0 "register_operand" "")
   [(set (match_operand:QI 0 "bit_register_indirect_operand" "=WU")
        (xor:QI (match_operand:QI 1 "bit_register_indirect_operand" "%0")
                (match_operand:QI 2 "single_one_operand" "Y2")))]
-  "TARGET_H8300SX"
+  "TARGET_H8300SX
+   && rtx_equal_p(operands[0], operands[1])"
   "bnot\\t%V2,%0"
   [(set_attr "length" "8")])
 
   [(set_attr "length" "8")])
 
 (define_insn "xorqi3_1"
-  [(set (match_operand:QI 0 "bit_operand" "=r,U")
+  [(set (match_operand:QI 0 "bit_operand" "=U,r")
        (xor:QI (match_operand:QI 1 "bit_operand" "%0,0")
-               (match_operand:QI 2 "h8300_src_operand" "rQi,n")))]
+               (match_operand:QI 2 "h8300_src_operand" "Y2,rQi")))]
   "TARGET_H8300SX || register_operand (operands[0], QImode)
    || single_one_operand (operands[2], QImode)"
   "@
-   xor\\t%X2,%X0
-   bnot\\t%V2,%R0"
-  [(set_attr "length" "*,8")
-   (set_attr "length_table" "logicb,*")
-   (set_attr "cc" "set_znv,none_0hit")])
+   bnot\\t%V2,%R0
+   xor\\t%X2,%X0"
+  [(set_attr "length" "8,*")
+   (set_attr "length_table" "*,logicb")
+   (set_attr "cc" "none_0hit,set_znv")])
+
 
 (define_expand "xorqi3"
   [(set (match_operand:QI 0 "register_operand" "")
diff --git a/gcc/testsuite/gcc.dg/h8300-bit-insn-ice2.c b/gcc/testsuite/gcc.dg/h8300-bit-insn-ice2.c
new file mode 100644 (file)
index 0000000..ea9e8b3
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-skip-if "" { "h8300*-*-*" } "*" "-msx*" }  */
+/* { dg-options "-O2" } */
+/* ICE for bit instruction generation using 16-bit const */
+
+#define MSTPCRA (*(volatile unsigned char*)0xFFFFC9)
+#define MSTPCRA2 (*(volatile unsigned char*)0xFFFDC8)
+
+int
+main (void)
+{
+  MSTPCRA = MSTPCRA2 & ~0x01;
+  MSTPCRA = MSTPCRA2 ^ ~0xFE;
+  MSTPCRA = MSTPCRA2 | ~0xFE;
+  return 0;
+}
+/* { dg-skip-if "" { "h8300*-*-*" } "*" "-msx*" }  */
+/* { dg-options "-O2" } */
+/* ICE for bit instruction generation using 16-bit const */
+
+#define MSTPCRA (*(volatile unsigned char*)0xFFFFC9)
+#define MSTPCRA2 (*(volatile unsigned char*)0xFFFDC8)
+
+int
+main (void)
+{
+  MSTPCRA = MSTPCRA2 & ~0x01;
+  MSTPCRA = MSTPCRA2 ^ ~0xFE;
+  MSTPCRA = MSTPCRA2 | ~0xFE;
+  return 0;
+}