This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Help with mode switching (create_pre_exit)
- From: Uros Bizjak <ubizjak at gmail dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Ilya Enkovich <enkovich dot gnu at gmail dot com>, Joern Rennecke <joern dot rennecke at embecosm dot com>
- Date: Sat, 19 Oct 2013 20:09:44 +0200
- Subject: Re: Help with mode switching (create_pre_exit)
- Authentication-results: sourceware.org; auth=none
Hello!
> 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
> accident.
[...]
> create_pre_exit code assumes value is returned in a single register dx
> which is wrong from the beginning. Then it does not realize set to dx
> and ax are copy of returned value, finally reaches the end of BB and
> splits there. It does not crash assuming it is a case with EH where
> there are no return value copy in exit block.
>
> If we exchange ax and dx usages then create_pre_exit will fail. If we
> have value returned on more registers and thus will have more usages
> then create_pre_exit will fail.
This should be fixed in [1].
> 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?
> Am I missing something here?
You should add BND register REGNO(s) used to return bounds to
ix86_function_value_regno_p. These additional registers will be
detected as valid mult-register outputs in create_pre_exit, and this
will bypass the picky assert. Please also see patch at [2].
[1] http://gcc.gnu.org/ml/gcc-patches/2013-10/msg01606.html
[2] http://gcc.gnu.org/ml/gcc-patches/2013-10/msg01602.html
Uros.