Hi Gang,
If you look at rest of the code in this function gs_x_1() in tree.c, you will
see that we are using similar logic for setting many other flags, i.e. set it
only if it is null. The idea is that it may not always be correct to update the
flag the way the change is trying to do below.
It looks like you already know where GCC updates the flag, you say in
stor-layout.c. Then typically the GS_NODE is updated right at that point.
Whenever you see the align getting updated, you can check if the tree has
already been converted to spin (using gspin_invoked()), and using
gs_set_operand to update the align. For similar instances, you can search for
gs_set_flag_value in the source code, and you would see the usage.
Please see if the above works.
Gautam
________________________________
From: Gang Yu <yugang...@gmail.com>
To: open64-devel <open64-devel@lists.sourceforge.net>; Gautam Chakrabarti
<gautam.c...@yahoo.com>
Sent: Thursday, December 8, 2011 5:55 PM
Subject: Re: Review request for fix bug929[GCC-SPIN]
Hi, Gautam:
Since you are the gcc expert and the gatekeeper for FE. Would you please
kindly review this patch? thank you very much.
Regards
Gang
On Sat, Dec 3, 2011 at 3:52 PM, Gang Yu <yugang...@gmail.com> wrote:
Hi,
>
> Could a gatekeeper please help review the fix for
>bug929(http://bugs.open64.net/show_bug.cgi?id=929)?
>
>A cut-down bug case:
>
>typedef long __kernel_time_t;
>typedef long __kernel_suseconds_t;
>typedef signed long long s64;
>typedef __kernel_suseconds_t suseconds_t;
>struct timespec;
>extern struct timespec ns_to_timespec(const s64 nsec);
>struct other {
> struct timespec *s;
> int x;
>} o;
>void foo(void) {
> o.x++;
>}
>struct timeval {
> __kernel_time_t tv_sec;
> __kernel_suseconds_t tv_usec;
>};
>struct timespec {
> __kernel_time_t tv_sec;
> long tv_nsec;
>};
>
>struct timeval ns_to_timeval(const s64 nsec)
>{
> struct timespec ts = ns_to_timespec(nsec);
> struct timeval tv;
> tv.tv_sec = ts.tv_sec;
> tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
> return tv;
>}
>
>opencc build with CG assertion:
>
>### Assertion failure at line 1678 of
>/fc/proj/ctires/open64/o64guru/src/Fri/trunk/osprey/be/cg/lra.cxx:
>### Compiler Error in file bug929-cutdown.c during Local Register Allocation
>phase:
>### LRA: Error in Add_Avail_Reg
>opencc INTERNAL ERROR:
>/fc/proj/ctires/open64/o64guru/OPEN64_X86_DBG/LATEST/bits//lib/gcc-lib/x86_64-open64-linux/5.0/be
> returned non-zero status 1
>
>Analysis:
>
>Although this bug is asserted at CG phase, in fact, it is already wrong at
>SPIN generation. SPIN DECL snippet for struct timespec is as follows:
>
>@gs_tree_type GS_RECORD_TYPE<2467408> { (0)GS_TCC<2467520> GS_TCC_TYPE
>(3)IB_BIT_VECTOR<2467524> GS_TYPE_LANG_FLAG_0 (5)IB_STRING<2467876> "VOID"
>(9)IB_INT<2467884> 8 (10)IB_INT<2467892> -1 (12)IB_INT<2467900> 0
>(22)IB_BIT_VECTOR<2467908>
> @gs_type_name GS_IDENTIFIER_NODE<2467808> { (0)GS_TCC<2467848>
>GS_TCC_EXCEPTIONAL (3)IB_BIT_VECTOR<2467852> (4)IB_STRING<2467868>
>"timespec"
>
>
>this is unexpected, since timespec has two fields, tv_sec and tv_nsec, at
>x86_64 , both are 64bit alignment and timespec has no packed or useralgin
>propertie. So, the struct should be 64bit align.
>
>Investigation shows, gs_type_align property is updated at function
>gs_x_1, tree.c
>10794
>10795 /* align */
>10796 if (gs_operand((gs_t) GS_NODE(t), GS_TYPE_ALIGN) == NULL) {
>10797 gs_t align_node;
>10798 align_node = __gs (IB_INT);
>10799 _gs_n (align_node, TYPE_ALIGN (t));
>10800 gs_set_operand ((gs_t) GS_NODE (t), GS_TYPE_ALIGN, align_node);
>10801 }
>
>This logic says, when we have not updated the ALIGN field, update it from gcc
>tree. The right logic should be, we always update the ALIGN propertie if it is
>not updated or we get a different value from gcc tree. So, the suggested
>patch:
>
>osprey-gcc-4.2.0/gcc/tree.c -- 791fd43..87e478b 100644
>--- a/osprey-gcc-4.2.0/gcc/tree.c
>+++ b/osprey-gcc-4.2.0/gcc/tree.c
>@@ -10793,7 +10793,10 @@ gs_x_1 (tree t, HOST_WIDE_INT seq_num)
> gs_set_operand((gs_t) GS_NODE(t), GS_TYPE_USER_ALIGN, gs_x_1(NULL,
>seq_num));
> /* align */
>- if (gs_operand((gs_t) GS_NODE(t), GS_TYPE_ALIGN) == NULL) {
>+ if (gs_operand((gs_t) GS_NODE(t), GS_TYPE_ALIGN) == NULL ||
>+ // bug929 open64.net. Don't miss the type align field update
>+ // after the layout is recalulated by gcc stor-layout.
>+ (TYPE_ALIGN (t) != (unsigned int) gs_n(gs_operand((gs_t)
>GS_NODE(t), GS_TYPE_ALIGN)))) {
> gs_t align_node;
> align_node = __gs (IB_INT);
> _gs_n (align_node, TYPE_ALIGN (t));
>
>Would a gatekeeper please help a review? thanks
>
>
>Regards
>Gang
>
------------------------------------------------------------------------------
Cloud Services Checklist: Pricing and Packaging Optimization
This white paper is intended to serve as a reference, checklist and point of
discussion for anyone considering optimizing the pricing and packaging model
of a cloud services business. Read Now!
http://www.accelacomm.com/jaw/sfnl/114/51491232/
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel