This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

problem with purge_addressof (function.c)


Hi,

I've checked out PR 2035 which claims to be an ICE for valid
code. It's an ICE all right but the code is invalid.

A small program that triggers the bug is the following:

int  main(int  v0, char ** v1) 
{
double	v8;
union {
        struct {
                float  f34;
		float  f35;
	} f;
} d65;

      	d65.f.f34=*(float *)&v8;
	return 0;
}

(The problem only shows when compiling with -O4).

This gives the following instruction:

(insn 15 30 16 (set (reg:SF 110)
	(mem:SF (addressof:SI (reg/v:DF 109) 108 370a28) 9)) 84 {*movsf_insn_novis} (nil)
    (nil))

purge_addressoff_1 tries to remove the addressof by replacing it with
a bitfield operation. But the comment in expmed.c clearly states that
this isn't going to work.

      else
	/* Else we've got some float mode source being extracted into
	   a different float mode destination -- this combination of
	   subregs results in Severe Tire Damage.  */
	abort ();

Should this limitation be removed or should purge_addressof handle
this case differently and if so how?

-- 
Lieven Marchand <mal@wyrd.be>
Glaðr ok reifr skyli gumna hverr, unz sinn bíðr bana.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]