http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51074
Pat Haugen <pthaugen at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |pthaugen at gcc dot gnu.org
--- Comment #6 from Pat Haugen <pthaugen at gcc dot gnu.org> 2011-11-21
23:57:29 UTC ---
cpu2000 benchmark 176.gcc started failing on PPC with this patch (miscompare of
results). Appears to be due to result from VEC_INTERLEAVE_[LOW|HIGH]_EXPR when
folding. Following is simple testcase to demonstrate results.
temp/gcc> cat junk.c
#include <stdio.h>
#define NUM 8
struct hard_reg_n_uses { int regno; int uses; };
struct hard_reg_n_uses hard_reg_n_uses[NUM];
void main() {
int i;
for (i = 0; i < NUM; i++)
{
hard_reg_n_uses[i].uses = 0;
hard_reg_n_uses[i].regno = i;
}
for (i = 0; i < NUM; i++)
printf("i = %d regno = %d\n",i,hard_reg_n_uses[i].regno);
}
When compiled with revisions prior to r181297 with -O3 -mcpu=power7 I get the
following results:
temp/gcc> a.out
i = 0 regno = 0
i = 1 regno = 1
i = 2 regno = 2
i = 3 regno = 3
i = 4 regno = 4
i = 5 regno = 5
i = 6 regno = 6
i = 7 regno = 7
revision 181297 (and later) give:
temp/gcc> a.out
i = 0 regno = 2
i = 1 regno = 3
i = 2 regno = 0
i = 3 regno = 1
i = 4 regno = 6
i = 5 regno = 7
i = 6 regno = 4
i = 7 regno = 5
Comparing the tree dumps of r181296 and r181297, diff comes in at 127t.dom2
dump.
36,38c36,38
< vect_inter_high.15_17 = VEC_INTERLEAVE_HIGH_EXPR <{ 0, 1, 2, 3 }, { 0, 0,
0, 0 }>;
< vect_inter_low.16_37 = VEC_INTERLEAVE_LOW_EXPR <{ 0, 1, 2, 3 }, { 0, 0, 0,
0 }>;
< MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses] = vect_inter_high.15_17;
---
> vect_inter_high.15_17 = { 2, 0, 3, 0 };
> vect_inter_low.16_37 = { 0, 0, 1, 0 };
> MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses] = { 2, 0, 3, 0 };
40c40
< MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 16B] =
vect_inter_low.16_37;
---
> MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 16B] = { 0, 0, 1, 0 };
47,49c47,49
< vect_inter_high.15_28 = VEC_INTERLEAVE_HIGH_EXPR <{ 4, 5, 6, 7 }, { 0, 0,
0, 0 }>;
< vect_inter_low.16_29 = VEC_INTERLEAVE_LOW_EXPR <{ 4, 5, 6, 7 }, { 0, 0, 0,
0 }>;
< MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 32B] =
vect_inter_high.15_28;
---
> vect_inter_high.15_28 = { 6, 0, 7, 0 };
> vect_inter_low.16_29 = { 4, 0, 5, 0 };
> MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 32B] = { 6, 0, 7, 0 };
51c51
< MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 48B] =
vect_inter_low.16_29;
---
> MEM[(struct hard_reg_n_uses[8] *)&hard_reg_n_uses + 48B] = { 4, 0, 5, 0 };