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
alias-patch.diff
Description: Binary data
------------------------------------------------------------------------------ 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