Now phi-translate only exists in loadpre. scalarpre doesn't have phi-translate support, so it will miss some simple pre opportunities. Like the following testcase, current scalarpre cannot recognize the last "a * b" is fully redundent because a and b used by the last "a * b" expr are both defined by phis.
long a[100], b[100];
long g1, g2, g3;
attribute((pure))
long goo();
void foo(long a, long b, long c, long d) {
g1 = a * b; if (__builtin_expect(g2 > 3, 0)) { a = c; b = d; g2 = a * b; } g3 = a * b; // fully redundant.
}
The patch adds support for phi-translate in scalarpre. This is only a temporary solution before the newpre based on newgvn is available.