This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

ssa bootstrap problem on x86 (cmpstrsi_1 pattern)


Hi Mark,

I've looked at the SSA bootstrap problem.  It's caused by an insn
in the x86 backend which looks like:

(define_insn "cmpstrsi_1"
  [(set (reg:CC 17)
	(if_then_else:CC (ne (match_operand:SI 2 "register_operand" "c")
			     (const_int 0))
	  (compare:SI (mem:BLK (match_operand:SI 0 "address_operand" "S"))
		      (mem:BLK (match_operand:SI 1 "address_operand" "D")))
	  (const_int 0)))
   (use (match_operand:SI 3 "immediate_operand" "i"))
   (use (reg:CC 17))
   (use (reg:SI 19))
   (clobber (match_dup 0))
   (clobber (match_dup 1))
   (clobber (match_dup 2))]
...)

The problem here is the match_dups.  IMHO, it would be much better if
these were written as match_scratch with '0', '1', and '2'
constraints.

Alternatively, we could detect this case in ssa.c and rewrite the insn
using a SEQUENCE, copying the first three operands.  We should do this
detection only when the MD file contains constructs that make it
necessary (specifically if an insn in the .md file has a MATCH_DUP
between something it uses and something it sets), as there's likely to
be a significant performance penalty.  And it'll be ugly.

Alternatively, we could declare that this pattern is inherently
incompatible with SSA and disable its use if SSA is requested.
-- 
- Geoffrey Keating <geoffk@cygnus.com>

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]