From 1b3d8f8a350ba123682377bc22e54750bc670f51 Mon Sep 17 00:00:00 2001 From: Geoff Keating Date: Fri, 1 Sep 2000 01:03:29 +0000 Subject: stmt.c (expand_asm_operands): Twiddle generating_concat_p so that CONCATs are not generated for ASMs. * 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 | 13 +++++++++++++ gcc/emit-rtl.c | 5 +++-- gcc/function.c | 4 ++++ gcc/rtl.c | 3 +++ gcc/rtl.h | 3 +++ gcc/stmt.c | 18 +++++++++++++++++- gcc/toplev.c | 4 ++++ 7 files changed, 47 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a986ca2..f2f017d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2000-08-31 Geoffrey Keating + + * 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 Masanobu Yuhara diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 632c4e2..9a32582 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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. diff --git a/gcc/function.c b/gcc/function.c index 8ce2d4e..4141c41 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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; diff --git a/gcc/rtl.c b/gcc/rtl.c index de28a60..ad89fff 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -578,6 +578,9 @@ shallow_copy_rtx (orig) /* 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; /* Return 1 if X and Y are identical-looking rtx's. This is the Lisp function EQUAL for rtx arguments. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index 92ee583..42b8f42 100644 --- 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 diff --git a/gcc/stmt.c b/gcc/stmt.c index af4c08f..f2763e7 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -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)) diff --git a/gcc/toplev.c b/gcc/toplev.c index b8a5498..20c6385 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -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; -- cgit v1.1