This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
question on ssa representation of aggregates
- From: "Amker.Cheng" <amker dot cheng at gmail dot com>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 22 Oct 2010 17:56:23 +0800
- Subject: question on ssa representation of aggregates
Hi :
In paper "Memory SSA-A Unified Approach for Sparsely Representing
Memory Operations",
section 2.2, it says :
"Whenever possible, compiler will create symbolic names to represent distinct
regions inside aggregates(called structure field tags or SFT). For instance,
in Figure 2(b), GCC will create three SFT symbols for this structure, namely
SFT.0 for A.x, SFT.1 for A.b and SFT.2 for A.a"
I tried GCC4.4.1(mips target) with following piece of code,
-------------------------------start
struct tag_1
{
int *i;
int *j;
int *x;
int y;
}a;
struct tag_2
{
struct tag_1 t1[100];
int x[200];
int *y;
}s;
int func(int **p)
{
int *c = *p;
if (a.y > 0)
s.y = *p1;
else
*c = *s.y;
return 0;
}
-------------------------------end
The "055t.alias" dumped are like,
-------------------------------start
func (int * * p)
{
int * c;
int * gp.2;
int g.1;
int D.1352;
int * D.1351;
int * D.1349;
int * * p1.0;
int D.1345;
<bb 2>:
# VUSE <gp_12(D), a_13(D), arr_14(D), s_15(D), SMT.13_16(D)>
c_2 = *p_1(D);
# VUSE <a_13(D)>
D.1345_3 = a.y;
if (D.1345_3 > 0)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
# VUSE <p1_17(D)>
p1.0_4 = p1;
# VUSE <gp_12(D), a_13(D), arr_14(D), s_15(D), SMT.13_16(D)>
D.1349_5 = *p1.0_4;
# s_18 = VDEF <s_15(D)>
s.y = D.1349_5;
goto <bb 5>;
<bb 4>:
# VUSE <s_15(D)>
D.1351_6 = s.y;
# VUSE <g_19(D), a_13(D), s_15(D), SMT.14_20(D)>
D.1352_7 = *D.1351_6;
# g_21 = VDEF <g_19(D)>
# a_22 = VDEF <a_13(D)>
# s_23 = VDEF <s_15(D)>
# SMT.14_24 = VDEF <SMT.14_20(D)>
*c_2 = D.1352_7;
-------------------------------end.
it seems structure a and s are treated as array variables, no SFT is created.
Did I miss anything or the implementation is different? Thanks.
--
Best Regards.