patch for PR82444

Message ID 540c9fcb-948b-f4b9-2561-033513db8219@redhat.com
State New
Headers show
Series
  • patch for PR82444
Related show

Commit Message

Vladimir Makarov Jan. 31, 2018, 7:05 p.m.
The following patch fixes ICE for

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82444

   The patch was successfully bootstrapped on x86_64.

   Committed as rev. 257254.

Comments

Richard Sandiford Feb. 1, 2018, 5:10 p.m. | #1
Vladimir Makarov <vmakarov@redhat.com> writes:
> Index: ira.c

> ===================================================================

> --- ira.c	(revision 257157)

> +++ ira.c	(working copy)

> @@ -1578,7 +1578,8 @@ ira_init_register_move_cost (machine_mod

>    ira_assert (ira_register_move_cost[mode] == NULL

>  	      && ira_may_move_in_cost[mode] == NULL

>  	      && ira_may_move_out_cost[mode] == NULL);

> -  ira_assert (have_regs_of_mode[mode]);

> +  /* have_regs_of_mode[mode] might be false because it might be

> +     E_<mode> (see genmodes) of pseudo with <mode>.  */


Not sure about the E_<mode>/genmodes reference here.  Isn't it simply
"because it might be the mode a pseudo register"?

Is it OK to expand the explanation a bit, as below?

Richard


2018-02-01  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* ira.c (ira_init_register_move_cost): Adjust comment.

Index: gcc/ira.c
===================================================================
--- gcc/ira.c	2018-02-01 17:09:45.998165072 +0000
+++ gcc/ira.c	2018-02-01 17:09:46.150158481 +0000
@@ -1578,8 +1578,10 @@ ira_init_register_move_cost (machine_mod
   ira_assert (ira_register_move_cost[mode] == NULL
 	      && ira_may_move_in_cost[mode] == NULL
 	      && ira_may_move_out_cost[mode] == NULL);
-  /* have_regs_of_mode[mode] might be false because it might be
-     E_<mode> (see genmodes) of pseudo with <mode>.  */
+  /* Note that we might be asked about the move costs of modes that
+     cannot be stored in any hard register, for example if an inline
+     asm tries to create a register operand with an impossible mode.
+     We therefore can't assert have_regs_of_mode[mode] here.  */
   for (cl1 = 0; cl1 < N_REG_CLASSES; cl1++)
     for (cl2 = 0; cl2 < N_REG_CLASSES; cl2++)
       {
Vladimir Makarov Feb. 1, 2018, 7:29 p.m. | #2
On 02/01/2018 12:10 PM, Richard Sandiford wrote:
> Vladimir Makarov <vmakarov@redhat.com> writes:

> Not sure about the E_<mode>/genmodes reference here.  Isn't it simply

> "because it might be the mode a pseudo register"?

>

> Is it OK to expand the explanation a bit, as below?

>

Yes, it is OK.  It is a better explanation.  Thank you, Richard.
> 2018-02-01  Richard Sandiford  <richard.sandiford@linaro.org>

>

> gcc/

> 	* ira.c (ira_init_register_move_cost): Adjust comment.

>

> Index: gcc/ira.c

> ===================================================================

> --- gcc/ira.c	2018-02-01 17:09:45.998165072 +0000

> +++ gcc/ira.c	2018-02-01 17:09:46.150158481 +0000

> @@ -1578,8 +1578,10 @@ ira_init_register_move_cost (machine_mod

>     ira_assert (ira_register_move_cost[mode] == NULL

>   	      && ira_may_move_in_cost[mode] == NULL

>   	      && ira_may_move_out_cost[mode] == NULL);

> -  /* have_regs_of_mode[mode] might be false because it might be

> -     E_<mode> (see genmodes) of pseudo with <mode>.  */

> +  /* Note that we might be asked about the move costs of modes that

> +     cannot be stored in any hard register, for example if an inline

> +     asm tries to create a register operand with an impossible mode.

> +     We therefore can't assert have_regs_of_mode[mode] here.  */

>     for (cl1 = 0; cl1 < N_REG_CLASSES; cl1++)

>       for (cl2 = 0; cl2 < N_REG_CLASSES; cl2++)

>         {

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 257252)
+++ ChangeLog	(working copy)
@@ -1,3 +1,8 @@ 
+2018-01-31  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR target/82444
+	* ira.c (ira_init_register_move_cost): Remove assert.
+
 2018-01-31  Eric Botcazou  <ebotcazou@adacore.com>
 
 	PR rtl-optimization/84071
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 257252)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@ 
+2018-01-31  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR target/82444
+	* gcc.target/i386/pr82444.c: New.
+
 2018-01-31  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/84092
Index: ira.c
===================================================================
--- ira.c	(revision 257157)
+++ ira.c	(working copy)
@@ -1578,7 +1578,8 @@  ira_init_register_move_cost (machine_mod
   ira_assert (ira_register_move_cost[mode] == NULL
 	      && ira_may_move_in_cost[mode] == NULL
 	      && ira_may_move_out_cost[mode] == NULL);
-  ira_assert (have_regs_of_mode[mode]);
+  /* have_regs_of_mode[mode] might be false because it might be
+     E_<mode> (see genmodes) of pseudo with <mode>.  */
   for (cl1 = 0; cl1 < N_REG_CLASSES; cl1++)
     for (cl2 = 0; cl2 < N_REG_CLASSES; cl2++)
       {
Index: testsuite/gcc.target/i386/pr82444.c
===================================================================
--- testsuite/gcc.target/i386/pr82444.c	(nonexistent)
+++ testsuite/gcc.target/i386/pr82444.c	(working copy)
@@ -0,0 +1,5 @@ 
+/* { dg-do compile { target { ia32 } } } */
+/* { dg-options "-march=athlon" } */
+
+__float128 a;
+void b () { __asm__("" : "+r"(a)); } /* { dg-error "inconsistent operand constraints in an" } */