Author: shihui
Date: 2011-04-06 01:54:02 -0400 (Wed, 06 Apr 2011)
New Revision: 3536
Modified:
trunk/osprey/be/com/constraint_graph.cxx
Log:
Fix bug751:
StInfo::alignOffset doesn't return pointer size aligned constraint graph node.
Issue is computation order in expression "if (offset & (~(Pointer_Size-1)) ==
offset)" is wrong.
== has higher priority than &
Another isuse is handling complex element.
In setting modulus for complex, it's treated as a structure with two elements.
However in StInfo::alignOffset, it always aligns offset to the real part of the
complex.
Which cauese real part always alias with img part.
Fix in StInfo::alignOffset
1. Correct computation order using parenthesis.
2. for complex, offset can be aligned to both real and img part.
Code Review: Sun Chan
Modified: trunk/osprey/be/com/constraint_graph.cxx
===================================================================
--- trunk/osprey/be/com/constraint_graph.cxx 2011-04-06 05:40:05 UTC (rev
3535)
+++ trunk/osprey/be/com/constraint_graph.cxx 2011-04-06 05:54:02 UTC (rev
3536)
@@ -2752,7 +2752,7 @@
// is not need to adjust. It is the sub-pointer size offsets
// that will cause issues, especially if the offsets to not
// match up with a valid field offset in the current TY
- if (offset & (~(Pointer_Size-1)) == offset)
+ if ((offset & (~(Pointer_Size-1))) == offset)
return offset;
TY ty = Ty_Table[ty_idx];
@@ -2773,8 +2773,16 @@
if (kind == KIND_SCALAR ||
kind == KIND_FUNCTION ||
kind == KIND_POINTER ||
- kind == KIND_VOID)
- offset = offset & (~(TY_size(ty)-1));
+ kind == KIND_VOID) {
+ UINT64 size = TY_size(ty);
+ // if scalar type is a complex, no need align to start of
+ // complex, it can also align to the imaginary part.
+ // Complex actually need treated as a struct.
+ if (MTYPE_is_complex(TY_mtype(ty))) {
+ size = size / 2;
+ }
+ offset = offset & (~(size-1));
+ }
else { // kind == KIND_STRUCT
FmtAssert(kind == KIND_STRUCT,("Expecting only structs here"));
@@ -2786,6 +2794,12 @@
if (TY_kind(fty) == KIND_ARRAY ||
TY_kind(fty) == KIND_STRUCT)
offset = start + alignOffset(FLD_type(fld),(offset-start));
+ // treat complex as a struct
+ else if (MTYPE_is_complex(TY_mtype(fty))) {
+ UINT64 size = TY_size(fty);
+ size = size / 2;
+ offset = start + ((offset-start) & (~(size-1)));
+ }
else
offset = start;
break;
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel