Help with mode switching (create_pre_exit)
Tue Sep 3 15:36:00 GMT 2013
Quoting Ilya Enkovich <email@example.com>:
> I'm fighting with mode switching (to be more precise with
> create_pre_exit function) trying to make it work for MPX. I saw
> create_pre_exit had some stability issues before and now I'm facing
> similar issues trying to have it working when bound register is
> returned by function in addition to GPR.
> The more I look into create_pre_exit code, the more I think it makes
> some assumptions which are wrong. Also it is very sensitive to the
> code structure and simple changes in exit block crashes pre-exit block
> creation. And in some cases it seems to me function does not fail by
Basically, create_pre_exit is paranoid about values being returned in
likely spilled registers, and/or the return value copy depending on a
This makes sense for the SH (integer/struct values are returned in r0 -
is likely spilled; floating point return in fr0/dr0 / more or less mode
switched), but I'm not aware that it makes sense for other mode
switched architectures. Well, maybe x86/ia_64, it's got a likely
spilled return register, and does MPX make the copies mode switched?
> There is an additional hard reg used for returned value and now
> returned value is stored in non subsequent registers. I think that to
> successfully cover all cases here, function_value target hook should
> be used to determine returned hard regs, rather than use the last
> 'use' insn to determine required hard regs. Does it sound reasonable?
Yes. While it used to be the case that mode switching was only done for
targets that returned values in a single locations, your post shows we can
no longer make this assumption.
I suppose we could also avoid a lot of useless processing if we just don't
worry about return value copies as such (i.e. having to stay last as much
as possible) if the return register(s) is/are not likely spilled.
In that case, we could really handle the pre-exit block like any other block.
More information about the Gcc