On Wed, Nov 12, 2014 at 9:25 PM, Teresa Johnson <[email protected]> wrote:
> Added testcase. Here is the new patch:
>
> 2014-11-12 <[email protected]>
>
> gcc:
> PR tree-optimization/63841
> * tree.c (initializer_zerop): A constructor with no elements
> does not zero initialize.
Actually an empty constructor does zero initialize. A clobber does not.
The check you want is TREE_CLOBBER_P instead.
Thanks,
Andrew
>
> gcc/testsuite:
> * g++.dg/tree-ssa/pr63841.C: New test.
>
> Index: tree.c
> ===================================================================
> --- tree.c (revision 217190)
> +++ tree.c (working copy)
> @@ -10330,6 +10330,8 @@ initializer_zerop (const_tree init)
> {
> unsigned HOST_WIDE_INT idx;
>
> + if (!CONSTRUCTOR_NELTS (init))
> + return false;
> FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), idx, elt)
> if (!initializer_zerop (elt))
> return false;
> Index: testsuite/g++.dg/tree-ssa/pr63841.C
> ===================================================================
> --- testsuite/g++.dg/tree-ssa/pr63841.C (revision 0)
> +++ testsuite/g++.dg/tree-ssa/pr63841.C (working copy)
> @@ -0,0 +1,38 @@
> +/* { dg-do run } */
> +/* { dg-options "-O2" } */
> +
> +#include <cstdio>
> +#include <string>
> +
> +std::string __attribute__ ((noinline)) comp_test_write() {
> + std::string data;
> +
> + for (int i = 0; i < 2; ++i) {
> + char b = 1 >> (i * 8);
> + data.append(&b, 1);
> + }
> +
> + return data;
> +}
> +
> +std::string __attribute__ ((noinline)) comp_test_write_good() {
> + std::string data;
> +
> + char b;
> + for (int i = 0; i < 2; ++i) {
> + b = 1 >> (i * 8);
> + data.append(&b, 1);
> + }
> +
> + return data;
> +}
> +
> +int main() {
> + std::string good = comp_test_write_good();
> + printf("expected: %hx\n", *(short*)good.c_str());
> +
> + std::string bad = comp_test_write();
> + printf("got: %hx\n", *(short*)bad.c_str());
> +
> + return good != bad;
> +}
>
> On Wed, Nov 12, 2014 at 2:17 PM, Xinliang David Li <[email protected]> wrote:
>> missing test case?
>>
>> David
>>
>> On Wed, Nov 12, 2014 at 2:13 PM, Teresa Johnson <[email protected]> wrote:
>>> This patch fixes an issue where tree-strlen was incorrectly removing a
>>> store of 0 into a string because it thought a prior CLOBBER (which is
>>> an empty constructor with no elements) was zero-initializing the
>>> string.
>>>
>>> Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for trunk?
>>>
>>> Thanks,
>>> Teresa
>>>
>>> 2014-11-12 <[email protected]>
>>>
>>> PR tree-optimization/63841
>>> * tree.c (initializer_zerop): A constructor with no elements
>>> does not zero initialize.
>>>
>>> Index: tree.c
>>> ===================================================================
>>> --- tree.c (revision 217190)
>>> +++ tree.c (working copy)
>>> @@ -10330,6 +10330,8 @@ initializer_zerop (const_tree init)
>>> {
>>> unsigned HOST_WIDE_INT idx;
>>>
>>> + if (!CONSTRUCTOR_NELTS (init))
>>> + return false;
>>> FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (init), idx, elt)
>>> if (!initializer_zerop (elt))
>>> return false;
>>>
>>>
>>> --
>>> Teresa Johnson | Software Engineer | [email protected] | 408-460-2413
>
>
>
> --
> Teresa Johnson | Software Engineer | [email protected] | 408-460-2413