On Sun, Sep 20, 2015 at 6:21 PM, Martin Sebor <mse...@gmail.com> wrote: > On 09/20/2015 12:38 AM, Richard Biener wrote: >> >> On September 20, 2015 1:40:12 AM GMT+02:00, Martin Sebor >> <mse...@gmail.com> wrote: >>> >>> On 09/19/2015 03:32 PM, Sören Brinkmann wrote: >>>> >>>> Hi Andrew, >>>> >>>> On Sat, 2015-09-19 at 11:34AM -0700, pins...@gmail.com wrote: >>>>> >>>>> >>>>> >>>>>> On Sep 19, 2015, at 11:00 AM, Sören Brinkmann >>> >>> <soren.brinkm...@xilinx.com> wrote: >>>>>> >>>>>> >>>>>> Hi, >>>>>> >>>>>> I recently came across some bug in my program that I could narrow >>> >>> down >>>>>> >>>>>> to the snipped below (also attached with a Makefile). >>>>>> >>>>>> extern unsigned int _vector_table; >>>>> >>>>> >>>>> You need the attribute weak here if the location of _vector_table >>> >>> can be a null pointer. >>>> >>>> >>>> Indeed, that fixes the problem. Would you have any additional >>> >>> background >>>> >>>> why the 'weak' is required in this case? To me it sounded like the >>>> '-fno-delete-null-pointer-checks' should be sufficient. >>> >>> >>> -fno-delete-null-pointer-checks prevents GCC from removing tests >>> for null pointers after such pointers have been dereferenced. For >>> example, in the following function, GCC normally eliminates the >>> second if statement because the first statement lets it assume >>> that p is not null (otherwise dereferencing it would be undefined). >>> >>> int foo (int *p) { >>> if (*p == 0) return 0; >>> if (p == 0) return 1; >>> return 2; >>> } >>> >>> The option doesn't affect other assumptions such as that every >>> object and function in a program lives at a valid, non-null >>> address. >> >> >> Actually we abuse this flag for exactly this purpose so I think the >> testcase shows a bug. Unless the particular target cannot have global vars >> at address zero. >> >> Would you mind opening a bugreport? > > > I'm not sure I follow. I've tested the original example with 6.0, > 5.1, 4.9, 4.8.3, and 4.8.1. All of these eliminate the test with > -fno-delete-null-pointer-checks. Are you saying that's a bug? If > so, what version retains the test?
It looks it's broken since forever (since we can optimize this which is starting with GCC 3.4). But the issue is a "trivial" one in RTLs nonzero_address_p. Richard. > Martin >