This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: ssa bootstrap problem on x86 (cmpstrsi_1 pattern)
- To: geoffk at cygnus dot com
- Subject: Re: ssa bootstrap problem on x86 (cmpstrsi_1 pattern)
- From: Mark Mitchell <mark at codesourcery dot com>
- Date: Sun, 23 Jul 2000 00:50:01 -0700
- Cc: gcc at gcc dot gnu dot org
- Organization: CodeSourcery, LLC
- References: <200007230424.VAA00564@localhost.cygnus.com>
Hi Mark,
I've looked at the SSA bootstrap problem. It's caused by an insn
in the x86 backend which looks like:
Thanks for tracking this down.
(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.
So we have something like:
[(SET (reg:CC 17)
(if_then_else:CC (ne (reg:SI 35) (const int 0)) ...)
(USE (reg:CC 17))
...
(CLOBBER (reg:SI 35)))
...]
right? This just doesn't have a sensible SSA representation. I don't
see how match_scratch helps. The bottom line is that moving any use
of register 35 past this point is bogus. SSA doesn't really have a
way of representing instructions that kill their input operands.
That's why I think this kind of thing should happen later in the
compiler. Right now, i386.md creates temporaries for the inputs to
cmpstrsi_1, then clobbers the temporaries.
Instead, we should generate some kind of placeholder here. Perhaps
just:
[(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 (reg:CC 17))
(use (reg:SI 19))]
Then, at some point after SSA, we should generate instructions to load
the temporaries and add the clobbers.
Does that make sense?
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com