This is the mail archive of the 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]
Other format: [Raw text]

What does un-cse exactly refer to?


Consider the following piece of code.

unsigned long g;

foo (unsigned long a)
  if (a == 0)
      // bar ();
      g = 0;

The interesting part of the rtx after cse looks like

(set (cc0)
     (compare (reg:SI 17)
	      (const_int 0)))

(set (pc)
     (if_then_else (ne (cc0)
		       (const_int 0))
		   (label_ref 19)

(set (mem/f:SI (symbol_ref:SI ("g")))
     (reg:SI 17)) ***

(code_label 19 ...)

See the *** above.  This is originally (const_int 0), but cse changes
it to (reg:SI 17), which is known to have (const_int 0).  This change
is a win in this particular example, but even with bar() in the above
code uncommented, the same change happens, raising the register
pressure because a non-call-clobbering register must be used just to
hold (const_int 0) across a function call.

Is this problem what "un-cse" in would
try to solve?

Interestingly, this happens on h8300 port but not on i386.  Maybe, cse
does not notice an implicit set (a == 0) on i386!?  By the way, the
cost of (const_int 0) is 0 on h8300 port.


Kazu Hirata

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