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]
Other format: [Raw text]

IRA undoing scheduling decisions


Fellow GCC developers,

I am seeing a performance regression on the port I maintain, and I would appreciate some pointers.

When I compile the following code

void f(int *x, int *y){
  *x = 7;
  *y = 4;
}

with GCC 4.3.2, I get the desired sequence of instructions.  I'll call it sequence A:

r0 = 7
r1 = 4
[x] = r0
[y] = r1

When I compile the same code with GCC 4.4.0, I get a sequence that is lower performance for my target machine.  I'll call it sequence B:

r0 = 7
[x] = r0
r0 = 4
[y] = r0

I see the same difference between GCC 4.3.2 and 4.4.0 when compiling for PowerPC, MIPS, ARM, and FR-V.

When I look at the RTL dumps, I see that the first scheduling pass always produces sequence A, across all targets and GCC versions I tried.  In GCC 4.3.2, sequence A persists throughout the remainder of compilation.  In GCC 4.4.0, for every target, the .ira dump shows that the sequence of instructions has reverted back to sequence B.

Are there any machine-dependent parameters that I can tune to prevent IRA from transforming sequence A into sequence B?  If not, where can I add a hook to allow this decision to be tuned per machine?

Is there any more information you would like me to provide?

Thank you,
Charles J. Tabony


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