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]

Re: 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:

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

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