http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56098



--- Comment #6 from werner at almesberger dot net 2013-01-25 22:46:17 UTC ---

Thanks for the analysis and the fixes ! I'll try them soonish.



Regarding work-arounds, the ones I mentioned for my original code snippet

(i.e., -O1 or -fno-strict-aliasing) aren't sufficient in the following more

general case:



volatile void *p;



#define P  (*(volatile int *) (p+8))





void foo(int x)

{

        P = 1;

        if (x)

                P = 2;

}



This is for gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 on x86-64. The offset (8)

may be architecture-specific. For values < 8, correct code is generated with

-O1 (but not -O2 or higher).



The good news is that -fno-tree-cselim does indeed avoid the bad read in all

cases I've tried, with any optimization level.

Reply via email to