------- Comment #4 from wilson at tuliptree dot org 2008-04-01 06:26 -------
Subject: Re: New: ICE on ia64 with vector declaration
inside #pragma omp parallel
steigers at phys dot ethz dot ch wrote:
> g++ -Wall -fopenmp -save-temps -o ice.o -c ice.h
I can reproduce this.
It dies in the eh pass. We have a TRY_CATCH_EXPR with an empty catch
clause. This fails in lower_eh_constructs_1 case TRY_CATCH_EXPR, as
i->ptr is null, and hence tsi_stmt segfaults.
It seems wrong to have an empty catch clause here. This was created
during the ehopt pass by optimize_double_finally. We have
try { A() } finally { try { } catch { ~A() } }
try { ... } finally { ~A() }
which is converted into
try { A() } catch { }
try { ~B() ... } finally { ~A() }
thus giving us the problematic empty catch clause.
The testcase doesn't fail on x86 as we end up with slightly different
gimple. In the 004t.gimple dump file, for x86 we have
struct vector x;
__comp_ctor (&D.7263);
try
{
D.7261 = 0.0;
and for IA-64 we have
struct vector x;
D.7300 = 0.0;
try
{
__comp_ctor (&D.7302);
The different placement of the ctor means the dtor ends up in different
places, and hence the bug triggers on IA-64 but not x86. I don't know
why we are getting the different gimplification here. This seems odd,
but I haven't tried looking into this yet.
Jim
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35364