stmt.c (expand_asm_operands): Twiddle generating_concat_p so that CONCATs are not...
authorGeoff Keating <geoffk@cygnus.com>
Fri, 1 Sep 2000 01:03:29 +0000 (01:03 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Fri, 1 Sep 2000 01:03:29 +0000 (01:03 +0000)
* stmt.c (expand_asm_operands): Twiddle generating_concat_p
so that CONCATs are not generated for ASMs.
* emit-rtl.c (gen_reg_rtx): Don't generate CONCATs when
not generating_concat_p.
* function.c (pop_function_context_from): Reset
generating_concat_p.
(prepare_function_start): Likewise.
* rtl.c (generating_concat_p): Define.
* rtl.h (generating_concat_p): Declare.
* toplev.c (rest_of_compilation): No CONCATs after RTL generation.

From-SVN: r36088

gcc/ChangeLog
gcc/emit-rtl.c
gcc/function.c
gcc/rtl.c
gcc/rtl.h
gcc/stmt.c
gcc/toplev.c

index a986ca2c993b7feaf18ccd1334acf00fb96d115a..f2f017df187f6577f1f6ac174ff3379bad15f8bc 100644 (file)
@@ -1,3 +1,16 @@
+2000-08-31  Geoffrey Keating  <geoffk@cygnus.com>
+
+       * stmt.c (expand_asm_operands): Twiddle generating_concat_p
+       so that CONCATs are not generated for ASMs.
+       * emit-rtl.c (gen_reg_rtx): Don't generate CONCATs when
+       not generating_concat_p.
+       * function.c (pop_function_context_from): Reset
+       generating_concat_p.
+       (prepare_function_start): Likewise.
+       * rtl.c (generating_concat_p): Define.
+       * rtl.h (generating_concat_p): Declare.
+       * toplev.c (rest_of_compilation): No CONCATs after RTL generation.
+
 2000-08-22  Philipp Thomas  <pthomas@suse.de>
             Masanobu Yuhara <yuhara@flab.fujitsu.co.jp>
 
index 632c4e24e254ee3bd51f33730cc923b6c8563f9e..9a3258248bd259512649dc71203a28d15e231817 100644 (file)
@@ -539,8 +539,9 @@ gen_reg_rtx (mode)
   if (no_new_pseudos)
     abort ();
 
-  if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
-      || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
+  if (generating_concat_p
+      && (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
+         || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT))
     {
       /* For complex modes, don't make a single pseudo.
         Instead, make a CONCAT of two pseudos.
index 8ce2d4e46c92359731a4001b80bb0fe9600a98a7..4141c4132642d21e581e5c270d509ed5661daaf8 100644 (file)
@@ -413,6 +413,7 @@ pop_function_context_from (context)
   /* Reset variables that have known state during rtx generation.  */
   rtx_equal_function_value_matters = 1;
   virtuals_instantiated = 0;
+  generating_concat_p = 1;
 }
 
 void
@@ -5920,6 +5921,9 @@ prepare_function_start ()
   /* Indicate that we have not instantiated virtual registers yet.  */
   virtuals_instantiated = 0;
 
+  /* Indicate that we want CONCATs now.  */
+  generating_concat_p = 1;
+
   /* Indicate we have no need of a frame pointer yet.  */
   frame_pointer_needed = 0;
 
index de28a603a9c0bceaebac8c2c5aabd37ad8d25f29..ad89fff092068b9ec850675a2426efe17359fd71 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -578,6 +578,9 @@ shallow_copy_rtx (orig)
 \f
 /* This is 1 until after the rtl generation pass.  */
 int rtx_equal_function_value_matters;
+
+/* Nonzero when we are generating CONCATs.  */
+int generating_concat_p;
 \f
 /* Return 1 if X and Y are identical-looking rtx's.
    This is the Lisp function EQUAL for rtx arguments.  */
index 92ee5838417c9912a4032281aa134e1e94ad0d4f..42b8f425728b829692c179ce9fe42ad15d31ef4c 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1102,6 +1102,9 @@ extern const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS];
    This is 1 until after the rtl generation pass.  */
 extern int rtx_equal_function_value_matters;
 
+/* Nonzero when we are generating CONCATs.  */
+extern int generating_concat_p;
+
 /* Generally useful functions.  */
 
 /* The following functions accept a wide integer argument.  Rather than
index af4c08f293f62d741897b6191c1655b126025d30..f2763e7396f7bd254495a3799973fabe2f5be907 100644 (file)
@@ -1330,6 +1330,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
     = (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
   /* The insn we have emitted.  */
   rtx insn;
+  int old_generating_concat_p = generating_concat_p;
 
   /* An ASM with no outputs needs to be treated as volatile, for now.  */
   if (noutputs == 0)
@@ -1537,6 +1538,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
         Make the asm insn write into that, then our caller will copy it to
         the real output operand.  Likewise for promoted variables.  */
 
+      generating_concat_p = 0;
+
       real_output_rtx[i] = NULL_RTX;
       if ((TREE_CODE (val) == INDIRECT_REF
           && allows_mem)
@@ -1556,7 +1559,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
 
          if (! allows_reg && GET_CODE (output_rtx[i]) != MEM)
            error ("output number %d not directly addressable", i);
-         if (! allows_mem && GET_CODE (output_rtx[i]) == MEM)
+         if ((! allows_mem && GET_CODE (output_rtx[i]) == MEM)
+             || GET_CODE (output_rtx[i]) == CONCAT)
            {
              real_output_rtx[i] = protect_from_queue (output_rtx[i], 1);
              output_rtx[i] = gen_reg_rtx (GET_MODE (output_rtx[i]));
@@ -1570,6 +1574,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
          TREE_VALUE (tail) = make_tree (type, output_rtx[i]);
        }
 
+      generating_concat_p = old_generating_concat_p;
+
       if (is_inout)
        {
          inout_mode[ninout] = TYPE_MODE (TREE_TYPE (TREE_VALUE (tail)));
@@ -1727,6 +1733,11 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
 
       op = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode, 0);
 
+      /* Never pass a CONCAT to an ASM.  */
+      generating_concat_p = 0;
+      if (GET_CODE (op) == CONCAT)
+       op = force_reg (GET_MODE (op), op);
+
       if (asm_operand_ok (op, constraint) <= 0)
        {
          if (allows_reg)
@@ -1759,6 +1770,7 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
               not satisfied.  */
            warning ("asm operand %d probably doesn't match constraints", i);
        }
+      generating_concat_p = old_generating_concat_p;
       XVECEXP (body, 3, i) = op;
 
       XVECEXP (body, 4, i)      /* constraints */
@@ -1770,6 +1782,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
   /* Protect all the operands from the queue now that they have all been
      evaluated.  */
 
+  generating_concat_p = 0;
+
   for (i = 0; i < ninputs - ninout; i++)
     XVECEXP (body, 3, i) = protect_from_queue (XVECEXP (body, 3, i), 0);
 
@@ -1787,6 +1801,8 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
        = gen_rtx_ASM_INPUT (inout_mode[i], digit_strings[j]);
     }
 
+  generating_concat_p = old_generating_concat_p;
+
   /* Now, for each output, construct an rtx
      (set OUTPUT (asm_operands INSN OUTPUTNUMBER OUTPUTCONSTRAINT
                               ARGVEC CONSTRAINTS))
index b8a5498ae8fe28f14192e083dc71747f433c0b10..20c6385edcf239583830ff490271a2cc37fdeff8 100644 (file)
@@ -2662,6 +2662,10 @@ rest_of_compilation (decl)
 
   timevar_push (TV_REST_OF_COMPILATION);
 
+  /* Now that we're out of the frontend, we shouldn't have any more
+     CONCATs anywhere.  */
+  generating_concat_p = 0;
+
   /* When processing delayed functions, prepare_function_start() won't
      have been run to re-initialize it.  */
   cse_not_expected = ! optimize;