This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
SH: cmpeqdi splitter messes up the CFG
- To: gcc-patches at gcc dot gnu dot org
- Subject: SH: cmpeqdi splitter messes up the CFG
- From: Alexandre Oliva <aoliva at redhat dot com>
- Date: 29 Aug 2000 06:02:52 -0300
- Organization: GCC Team, Red Hat
A define_split shouldn't be emitting jumps and labels. It messes up
the CFG and the BB structure too late in the compilation process.
Moreover, since this particular splitter is only applied after jump
optimization (why? couldn't we use subregs to avoid the condition?),
the JUMP_LABEL of its jump_insn is NULL, which breaks
insn_current_reference_address().
Here's an alternate implementation of the same idea. Ok to install?
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* config/sh/sh.md (cmpeqsi_ior_t, cmpeqsi_and_t): New insns.
(cmpeqdi_t splitter): Use cmpeqsi_and_t instead of emitting jumps
and labels.
Index: gcc/config/sh/sh.md
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/sh/sh.md,v
retrieving revision 1.40
diff -u -p -r1.40 sh.md
--- gcc/config/sh/sh.md 2000/08/22 19:39:56 1.40
+++ gcc/config/sh/sh.md 2000/08/29 08:54:12
@@ -558,6 +558,30 @@
cmp/eq %1,%0
cmp/eq %1,%0")
+(define_insn "cmpeqsi_ior_t"
+ [(set (reg:SI 18)
+ (ior:SI (reg:SI 18)
+ (eq:SI (match_operand:SI 0 "arith_reg_operand" "r,z,r")
+ (match_operand:SI 1 "arith_operand" "N,rI,r"))))]
+ ""
+ "@
+ bt 0f\;tst %0,%0\;0:
+ bt 0f\;cmp/eq %1,%0\;0:
+ bt 0f\;cmp/eq %1,%0\;0:"
+ [(set_attr "length" "4")])
+
+(define_insn "cmpeqsi_and_t"
+ [(set (reg:SI 18)
+ (and:SI (reg:SI 18)
+ (eq:SI (match_operand:SI 0 "arith_reg_operand" "r,z,r")
+ (match_operand:SI 1 "arith_operand" "N,rI,r"))))]
+ ""
+ "@
+ bf 0f\;tst %0,%0\;0:
+ bf 0f\;cmp/eq %1,%0\;0:
+ bf 0f\;cmp/eq %1,%0\;0:"
+ [(set_attr "length" "4")])
+
(define_insn "cmpgtsi_t"
[(set (reg:SI 18) (gt:SI (match_operand:SI 0 "arith_reg_operand" "r,r")
(match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))]
@@ -636,11 +660,9 @@
(match_operand:DI 1 "arith_reg_or_0_operand" "N,r")))]
"reload_completed"
[(set (reg:SI 18) (eq:SI (match_dup 2) (match_dup 3)))
- (set (pc) (if_then_else (eq (reg:SI 18) (const_int 0))
- (label_ref (match_dup 6))
- (pc)))
- (set (reg:SI 18) (eq:SI (match_dup 4) (match_dup 5)))
- (match_dup 6)]
+ (set (reg:SI 18)
+ (and:SI (reg:SI 18)
+ (eq:SI (match_dup 4) (match_dup 5))))]
"
{
operands[2]
@@ -654,7 +676,6 @@
+ (TARGET_LITTLE_ENDIAN ? 1 : 0)));
operands[4] = gen_lowpart (SImode, operands[0]);
operands[5] = gen_lowpart (SImode, operands[1]);
- operands[6] = gen_label_rtx ();
}")
(define_insn "cmpgtdi_t"
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me