you are right, I did not look careful enough.
Sun

2010/12/20 Jiangzhou HE <hejiangz...@gmail.com>:
> The current code uses ST_IDX_level(ST_st_idx(st)) == CURRENT_SYMTAB to
> determine whether an auto variable is uplevel ref. My fix follows the old
> way to do that. What is the right way? Thanks.
>
> On Mon, Dec 20, 2010 at 7:46 PM, Sun Chan <sun.c...@gmail.com> wrote:
>>
>> I thought there is a bit in the symbol table that tells whether the
>> symbol is uplevel ref. Your method seemed to be a hack
>> Sun
>>
>> On Mon, Dec 20, 2010 at 7:25 PM, Jiangzhou HE <hejiangz...@gmail.com>
>> wrote:
>> > Hi,
>> >
>> > Can a gatekeeper help to review the patch to bug 702
>> > (https://bugs.open64.net/show_bug.cgi?id=702)
>> >
>> > This is the test case:
>> >
>> > #include <stdio.h>
>> >
>> > void foo(int x) {
>> >
>> >
>> >   void far() {
>> >     x++;
>> >
>> >   }
>> >
>> >   void bar() {
>> >
>> >     int x2 = x;
>> >     far();
>> >
>> >     printf("%d %d\n", x, x2);
>> >   }
>> >
>> >
>> >   bar();
>> > }
>> >
>> >
>> > int main() {
>> >   foo(1);
>> >
>> >   return 0;
>> > }
>> >
>> > This is a bug of alias classifying. Because of this bug, in bar(), the
>> > variable x is treated as a local variable in current PU, so x gets an
>> > own
>> > class ID. Therefore, in the call site for far(), no CHI node is created
>> > for
>> > x. Then, by copy propagation, the last argument of printf() is replaced
>> > by
>> > x. Then we can see the wrong output.
>> >
>> > This is the buggy code:
>> >
>> >   // If this base_id is a local variable or parameter, it gets its
>> >   // own class.
>> >   if ((storage_class == SCLASS_AUTO &&
>> >        ST_IDX_level(ST_st_idx(st)) == CURRENT_SYMTAB) ||
>> >       storage_class == SCLASS_FORMAL                  ||
>> >       storage_class == SCLASS_FORMAL_REF              ||
>> >       storage_class == SCLASS_REG) {
>> >     // Set up the LDA and LDID classes for this variable...
>> >
>> > It checks whether the symbol is in current level for auto variables, but
>> > does not check for formals. I fix the bug in this way:
>> >
>> > diff --git a/osprey/be/opt/opt_alias_class.cxx
>> > b/osprey/be/opt/opt_alias_class.cxx
>> > index d4ebc6f..42db9b2 100644
>> > --- a/osprey/be/opt/opt_alias_class.cxx
>> > +++ b/osprey/be/opt/opt_alias_class.cxx
>> > @@ -409,10 +409,10 @@ ALIAS_CLASSIFICATION::New_base_id(const ST *st,
>> > TY_IDX
>> > ty)
>> >
>> >    // If this base_id is a local variable or parameter, it gets its
>> >    // own class.
>> > -  if ((storage_class == SCLASS_AUTO &&
>> > +  if (((storage_class == SCLASS_AUTO ||
>> > +        storage_class == SCLASS_FORMAL ||
>> > +        storage_class == SCLASS_FORMAL_REF) &&
>> >         ST_IDX_level(ST_st_idx(st)) == CURRENT_SYMTAB) ||
>> > -      storage_class == SCLASS_FORMAL                  ||
>> > -      storage_class == SCLASS_FORMAL_REF              ||
>> >        storage_class == SCLASS_REG) {
>> >      // Set up the LDA and LDID classes for this variable...
>> >      ALIAS_CLASS_MEMBER *ldid_item = New_alias_class_member(id);
>> > @@ -490,7 +490,8 @@ ALIAS_CLASSIFICATION::New_base_id(const ST *st,
>> > TY_IDX
>> > ty)
>> >            // uplevel reference and therefore must be treated as
>> >            // global because its address can be stored into a global,
>> >            // and it may contain the address of a global. Non-uplevel
>> > -          // references with SCLASS_AUTO are handled as locals above.
>> > +          // references with SCLASS_AUTO, SCLASS_FORMAL or
>> > +           // SCLASS_FORMAL_REF are handled as locals above.
>> >            // Including uplevel references here is the fix for 555533.
>> >            // 634200 was a milder case of the same problem, and only
>> >            // part of the fix was required to get that one right; that
>> > @@ -498,6 +499,8 @@ ALIAS_CLASSIFICATION::New_base_id(const ST *st,
>> > TY_IDX
>> > ty)
>> >            // parameters; 555533 makes clear that we have to go
>> >            // all the way and treat them as globals.
>> >            storage_class == SCLASS_AUTO    ||
>> > +           storage_class == SCLASS_FORMAL  ||
>> > +           storage_class == SCLASS_FORMAL_REF  ||
>> >            // storage class can be UNKNOWN for constant data because CG
>> > may
>> >            // already have run for an earlier PU and in the process
>> > lowered
>> >            // string (and maybe other) constants to .rodata.
>> > Unfortunately,
>> >
>> > Thanks!
>> >
>> > --
>> > Jiangzhou HE (何江舟)
>> >
>> > Institute of High-Performance Computing
>> > Department of Computer Science and Technology
>> > Tsinghua University, Beijing, China
>> >
>> >
>> >
>> > ------------------------------------------------------------------------------
>> > Lotusphere 2011
>> > Register now for Lotusphere 2011 and learn how
>> > to connect the dots, take your collaborative environment
>> > to the next level, and enter the era of Social Business.
>> > http://p.sf.net/sfu/lotusphere-d2d
>> > _______________________________________________
>> > Open64-devel mailing list
>> > Open64-devel@lists.sourceforge.net
>> > https://lists.sourceforge.net/lists/listinfo/open64-devel
>> >
>> >
>
>
>
> --
> Jiangzhou HE (何江舟)
>
> Institute of High-Performance Computing
> Department of Computer Science and Technology
> Tsinghua University, Beijing, China
>
>

------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to