Maxim U.,

There are no macros here for preprocessor to complain.

Ola,

The uninitialized warnings are generated by a pass that is separate from code 
generation.  The deficiencies of this pass should not affect correctness of the 
code.

--
Maxim Kuvyrkov
www.linaro.org



On Nov 27, 2014, at 1:31 PM, Maxim Uvarov <maxim.uva...@linaro.org> wrote:

> 
> 
> On 27 November 2014 at 12:16, Ola Liljedahl <ola.liljed...@linaro.org> wrote:
> Thanks Maxim,
> 
> Yes I should do that. I also intend to make the code used to reproduce
> the problem smaller.
> 
> One of my worries was that GCC considered the loop without side
> effects (ignoring the inline assembler in odp_spin()) and thus removed
> the loop (including the usage of the uninitialized variable). But that
> does not seem to be the case.
> 
> -- Ola
> 
> 
> Shouldn't preprocessor (cpp) show what really happens?
> 
> Maxim.
> 
>  
> On 27 November 2014 at 08:58, Maxim Kuvyrkov <maxim.kuvyr...@linaro.org> 
> wrote:
> > Hi Ola,
> >
> > I can confirm this problem with latest linaro-4.9-branch build.  However, 
> > this is target-independent problem (reproducible on, at least, x86 and 
> > aarch64), so it is best to be tracked and addressed via upstream bugzilla.
> >
> > Would you submit a PR on http://gcc.gnu.org/bugzilla ?
> >
> > Thank you,
> >
> > --
> > Maxim Kuvyrkov
> > www.linaro.org
> >
> > On Nov 25, 2014, at 1:34 AM, Pinski, Andrew 
> > <andrew.pin...@caviumnetworks.com> wrote:
> >
> >> Forwarding this message to the linaro toolchain list instead.  I am not 
> >> the person who should be supporting the Linaro ODP project with GCC 
> >> questiosn; the toolchain team inside Linaro should be instead.
> >>
> >> Thanks,
> >> Andrew Pinski
> >>
> >> ________________________________________
> >> From: Ola Liljedahl <ola.liljed...@linaro.org>
> >> Sent: Monday, November 24, 2014 2:31 PM
> >> To: lng-...@lists.linaro.org; Pinski, Andrew
> >> Subject: strange behavior in GCC for use of uninitialized variables
> >>
> >> Consider the following code fragment (from real life):
> >>
> >> #include <stdint.h>
> >>
> >> typedef volatile uint32_t odp_atomic_u32_t;
> >>
> >> static inline uint32_t odp_atomic_fetch_inc_u32(odp_atomic_u32_t *ptr)
> >> {
> >>        return __sync_fetch_and_add(ptr, 1);
> >> }
> >>
> >> static inline void odp_spin(void)
> >> {
> >> #ifdef __SSE2__
> >>        __asm__ __volatile__ ("pause");
> >> #else
> >>        __asm__ __volatile__ ("rep; nop");
> >> #endif
> >> }
> >>
> >> typedef struct {
> >>        int count;
> >>        odp_atomic_u32_t bar;
> >> } odp_barrier_t;
> >>
> >> void odp_barrier_wait(odp_barrier_t *barrier)
> >> {
> >>        uint32_t count;
> >>        int wasless;
> >>
> >> //     wasless = barrier->bar < barrier->count;  <<<lost on git add -p
> >>       __atomic_thread_fence(__ATOMIC_SEQ_CST);
> >>        count   = odp_atomic_fetch_inc_u32(&barrier->bar);
> >>
> >>        if (count == 2*barrier->count-1) {
> >>                barrier->bar = 0;
> >>        } else {
> >>                while ((barrier->bar < barrier->count) == wasless)
> >>                        odp_spin();
> >>        }
> >>
> >>        __atomic_thread_fence(__ATOMIC_SEQ_CST);
> >> }
> >>
> >> While fixing and cleaning up this code, the indicated line that
> >> initializes 'wasless' was dropped (because it reappears in a later
> >> patch in the patch set after the odp_atomic_fetch_inc call). To my
> >> surprise, GCC did not complain when compiling this file (using -O2
> >> -Wall). But it does complain when compiling with -O0 -Wall. With some
> >> investigation, it seems like GCC understands that if a statement does
> >> not have any side effects so it can optimize away everything,
> >> including the usage of the uninitialized variable and thus also the
> >> corresponding warning.
> >>
> >> olli@macmini:~/hacking/gcc-wunit$ gcc -O2 -Wall -c odp_barrier.c
> >> olli@macmini:~/hacking/gcc-wunit$ gcc -O0 -Wall -c odp_barrier.c
> >> odp_barrier.c: In function ‘odp_barrier_wait’:
> >> odp_barrier.c:42:9: warning: ‘wasless’ may be used uninitialized in
> >> this function [-Wmaybe-uninitialized]
> >>   while ((barrier->bar < barrier->count) == was less)
> >
> >
> >
> >
> 
> _______________________________________________
> lng-odp mailing list
> lng-...@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp


_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to