[5/7] Allow gimple debug stmt in widen mode
Kugan
kugan.vivekanandarajah@linaro.org
Thu Oct 15 05:45:00 GMT 2015
On 15/09/15 22:57, Richard Biener wrote:
> On Tue, Sep 8, 2015 at 2:00 AM, Kugan <kugan.vivekanandarajah@linaro.org> wrote:
>>
>> Thanks for the review.
>>
>> On 07/09/15 23:20, Michael Matz wrote:
>>> Hi,
>>>
>>> On Mon, 7 Sep 2015, Kugan wrote:
>>>
>>>> Allow GIMPLE_DEBUG with values in promoted register.
>>>
>>> Patch does much more.
>>>
>>
>> Oops sorry. Copy and paste mistake.
>>
>> gcc/ChangeLog:
>>
>> 2015-09-07 Kugan Vivekanandarajah <kuganv@linaro.org>
>>
>> * cfgexpand.c (expand_debug_locations): Remove assert as now we are
>> also allowing values in promoted register.
>> * gimple-ssa-type-promote.c (fixup_uses): Allow GIMPLE_DEBUG to bind
>> values in promoted register.
>> * rtl.h (wi::int_traits ::decompose): Accept zero extended value
>> also.
>>
>>
>>>> gcc/ChangeLog:
>>>>
>>>> 2015-09-07 Kugan Vivekanandarajah <kuganv@linaro.org>
>>>>
>>>> * expr.c (expand_expr_real_1): Set proper SUNREG_PROMOTED_MODE for
>>>> SSA_NAME that was set by GIMPLE_CALL and assigned to another
>>>> SSA_NAME of same type.
>>>
>>> ChangeLog doesn't match patch, and patch contains dubious changes:
>>>
>>>> --- a/gcc/cfgexpand.c
>>>> +++ b/gcc/cfgexpand.c
>>>> @@ -5240,7 +5240,6 @@ expand_debug_locations (void)
>>>> tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
>>>> rtx val;
>>>> rtx_insn *prev_insn, *insn2;
>>>> - machine_mode mode;
>>>>
>>>> if (value == NULL_TREE)
>>>> val = NULL_RTX;
>>>> @@ -5275,16 +5274,6 @@ expand_debug_locations (void)
>>>>
>>>> if (!val)
>>>> val = gen_rtx_UNKNOWN_VAR_LOC ();
>>>> - else
>>>> - {
>>>> - mode = GET_MODE (INSN_VAR_LOCATION (insn));
>>>> -
>>>> - gcc_assert (mode == GET_MODE (val)
>>>> - || (GET_MODE (val) == VOIDmode
>>>> - && (CONST_SCALAR_INT_P (val)
>>>> - || GET_CODE (val) == CONST_FIXED
>>>> - || GET_CODE (val) == LABEL_REF)));
>>>> - }
>>>>
>>>> INSN_VAR_LOCATION_LOC (insn) = val;
>>>> prev_insn = PREV_INSN (insn);
>>>
>>> So it seems that the modes of the values location and the value itself
>>> don't have to match anymore, which seems dubious when considering how a
>>> debugger should load the value in question from the given location. So,
>>> how is it supposed to work?
>>
>> For example (simplified test-case from creduce):
>>
>> fn1() {
>> char a = fn1;
>> return a;
>> }
>>
>> --- test.c.142t.veclower21 2015-09-07 23:47:26.362201640 +0000
>> +++ test.c.143t.promotion 2015-09-07 23:47:26.362201640 +0000
>> @@ -5,13 +5,18 @@
>> {
>> char a;
>> long int fn1.0_1;
>> + unsigned int _2;
>> int _3;
>> + unsigned int _5;
>> + char _6;
>>
>> <bb 2>:
>> fn1.0_1 = (long int) fn1;
>> - a_2 = (char) fn1.0_1;
>> - # DEBUG a => a_2
>> - _3 = (int) a_2;
>> + _5 = (unsigned int) fn1.0_1;
>> + _2 = _5 & 255;
>> + # DEBUG a => _2
>> + _6 = (char) _2;
>> + _3 = (int) _6;
>> return _3;
>>
>> }
>>
>> Please see that DEBUG now points to _2 which is a promoted mode. I am
>> assuming that the debugger would load required precision from promoted
>> register. May be I am missing the details but how else we can handle
>> this? Any suggestions?
>
> I would have expected the DEBUG insn to be adjusted as
>
> # DEBUG a => (char)_2
Thanks for the review. Please find the attached patch that attempts to
do this. I have also tested a version of this patch with gdb testsuite.
As Michael wanted, I have also removed the changes in rtl.h and
promoting constants in GIMPLE_DEBUG.
> Btw, why do we have
>
>> + _6 = (char) _2;
>> + _3 = (int) _6;
>
> ? I'd have expected
>
> unsigned int _6 = SEXT <_2, 8>
> _3 = (int) _6;
> return _3;
I am looking into it.
>
> see my other mail about promotion of PARM_DECLs and RESULT_DECLs -- we should
> promote those as well.
>
Just to be sure, are you referring to
https://gcc.gnu.org/ml/gcc-patches/2015-08/msg00244.html
where you wanted an IPA pass to perform this. This is one of my dodo
after this. Please let me know if you wanted here is a different issue.
Thanks,
Kuganb
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0005-debug-stmt-in-widen-mode.patch
Type: text/x-diff
Size: 3484 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20151015/174276a1/attachment.bin>
More information about the Gcc-patches
mailing list