[PATCH][middle-end] Make qsort in tree-ssa-sccvn.c stable.
Doug Kwan (關振德)
dougkwan@google.com
Wed May 13 19:20:00 GMT 2009
I will submit the patch after bootstrapping and regression test.
There was a typo in previous patch unfortunately and that will get
fixed.
-Doug
2009/5/13 Richard Guenther <richard.guenther@gmail.com>:
> On Wed, May 13, 2009 at 9:09 PM, Doug Kwan (關振德) <dougkwan@google.com> wrote:
>> This is not true. Even in trunk, there are non-PHI cases where a
>> GIMPLE statement has multiple operands to be sorted. I added checking
>> code for that condition and top-of-trunk failed to build libgcc.a due
>> to an asm statement. The output at the end of this mail shows the
>> offending statments and two operands. I changed my patch now that it
>> is in one function.
>
> Huh, asms. Ok...
>
> The modified patch is ok.
>
> Thanks,
> Richard.
>
>> -Doug
>>
>> -- new patch--
>> Index: gcc/gcc/tree-ssa-sccvn.c
>> ===================================================================
>> --- gcc/gcc/tree-ssa-sccvn.c (revision 147447)
>> +++ gcc/gcc/tree-ssa-sccvn.c (working copy)
>> @@ -2421,7 +2421,7 @@ compare_ops (const void *pa, const void
>> basic_block bbb;
>>
>> if (gimple_nop_p (opstmta) && gimple_nop_p (opstmtb))
>> - return 0;
>> + return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
>> else if (gimple_nop_p (opstmta))
>> return -1;
>> else if (gimple_nop_p (opstmtb))
>> @@ -2431,7 +2431,7 @@ compare_ops (const void *pa, const void
>> bbb = gimple_bb (opstmtb);
>>
>> if (!bba && !bbb)
>> - return 0;
>> + return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
>> else if (!bba)
>> return -1;
>> else if (!bbb)
>> @@ -2441,12 +2441,15 @@ compare_ops (const void *pa, const void
>> {
>> if (gimple_code (opstmta) == GIMPLE_PHI
>> && gimple_code (opstmtb) == GIMPLE_PHI)
>> - return 0;
>> + return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
>> else if (gimple_code (opstmta) == GIMPLE_PHI)
>> return -1;
>> else if (gimple_code (opstmtb) == GIMPLE_PHI)
>> return 1;
>> - return gimple_uid (opstmta) - gimple_uid (opstmtb);
>> + else if ((gimple_uid (opstmta) != gimple_uid (opstmtb))
>> + return gimple_uid (opstmta) - gimple_uid (opstmtb);
>> + else
>> + return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
>> }
>> return rpo_numbers[bba->index] - rpo_numbers[bbb->index];
>> }
>> ---
>> /disk2/dougkwan/gcc-trunk/obj-2/./gcc/xgcc
>> -B/disk2/dougkwan/gcc-trunk/obj-2/./gcc/
>> -B/usr/local/x86_64-unknown-linux-gnu/bin/
>> -B/usr/local/x86_64-unknown-linux-gnu/lib/ -isystem
>> /usr/local/x86_64-unknown-linux-gnu/include -isystem
>> /usr/local/x86_64-unknown-linux-gnu/sys-include -g -O2 -m32 -O2 -g
>> -O2 -DIN_GCC -W -Wall -Wwrite-strings -Wstrict-prototypes
>> -Wmissing-prototypes -Wcast-qual -Wold-style-definition -isystem
>> ./include -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2
>> -D__GCC_FLOAT_NOT_NEEDED -I. -I. -I../../.././gcc
>> -I../../../../gcc/libgcc -I../../../../gcc/libgcc/.
>> -I../../../../gcc/libgcc/../gcc -I../../../../gcc/libgcc/../include
>> -I../../../../gcc/libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT
>> -DHAVE_CC_TLS -DUSE_TLS -Wno-missing-prototypes -Wno-type-limits -o
>> divtf3.o -MT divtf3.o -MD -MP -MF divtf3.dep -fexceptions -c
>> ../../../../gcc/libgcc/../gcc/config/soft-fp/divtf3.c
>> -fvisibility=hidden -DHIDE_EXPORTS
>> # .MEM_889 = VDEF <.MEM_888>
>> __asm__("mul{l} %3" : "=a" _t_350, "=d" _m_f[2] : "%0" D.1739_348 :
>> "rm" D.1622_349);
>>
>> _t_350
>> .MEM_889
>> ../../../../gcc/libgcc/../gcc/config/soft-fp/divtf3.c: In function '__divtf3':
>> ../../../../gcc/libgcc/../gcc/config/soft-fp/divtf3.c:35: internal
>> compiler error: in compare_ops, at tree-ssa-sccvn.c:2464
>> Please submit a full bug report,
>> with preprocessed source if appropriate.
>> See <http://gcc.gnu.org/bugs.html> for instructions.
>>
>>
>>
>> 2009/5/13 Richard Guenther <richard.guenther@gmail.com>:
>>>
>>> Ok, in addition to the PHI case you will need (on 4.4 branch only, trunk
>>> should be fine with only the PHI case fixed)
>>>
>>> else if (opstmta == opstmtb)
>>> return SSA_NAME_VERSION (opa) - SSA_NAME_VERSION (opb);
>>> return gimple_uid (opstmta) - gimple_uid (opstmtb);
>>>
>>> thus, in case we look at the same defining stmts defer to the definition.
>>>
>>> That should hopefully also fix it for 4.4. On trunk we have at most
>>> one memory tag per stmt, so that situation cannot appear there.
>>
>
More information about the Gcc-patches
mailing list