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]

cmov for stores


int cmov(int* A ,int B ,int C ,int* D ,int* E ,int F ,int g)
{
  int k,f;
  for (k = 1; k <= 1000; k++) {
    A[k] = B+C;
    g = D[k-1] + E[k-1];
    if (g > A[k])  A[k]=g; 	/* This is not converted to cmov*/
    f += g;
  }
  return f;
}

In the above code, the if-then statement is not converted to conditional
move. It fails for "noce_mem_write_may_trap_or_fault_p ()" condition in
"ifcvt.c" as it thinks that there is a chance for A[k] access to trap.
The fact here is that in this case, A[k] will never trap because the
A[k] is already been written once along the path from Entry to the "A[k]
= g". So it is safe to convert it to a cmov statement. Though there
might be two extra moves (mem to reg and vice versa) statement, it is
still better to avoid the branch especially if it is unpredictable data
like for the eg above.

I'm planning to add this heuristic to the compiler but I'm not sure
which level that information is available. Is it possible/better to do
this in rtl level inside the ifcvt.c or do we need SSA for this
information? 

Thanks,
Dwarak



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