From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23186 invoked by alias); 25 Oct 2009 14:10:56 -0000 Received: (qmail 23176 invoked by uid 22791); 25 Oct 2009 14:10:53 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.33.17) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 25 Oct 2009 14:10:46 +0000 Received: from spaceape8.eur.corp.google.com (spaceape8.eur.corp.google.com [172.28.16.142]) by smtp-out.google.com with ESMTP id n9PEAhhg010392 for ; Sun, 25 Oct 2009 14:10:43 GMT Received: from pwj8 (pwj8.prod.google.com [10.241.219.72]) by spaceape8.eur.corp.google.com with ESMTP id n9PEAdaC002798 for ; Sun, 25 Oct 2009 07:10:40 -0700 Received: by pwj8 with SMTP id 8so955632pwj.23 for ; Sun, 25 Oct 2009 07:10:39 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.20.36 with SMTP id x36mr1071401wfi.231.1256479839293; Sun, 25 Oct 2009 07:10:39 -0700 (PDT) In-Reply-To: <1256315468.1606.20.camel@e200601-lin.cambridge.arm.com> References: <7587b290910160620l1266a752n651300451b392e64@mail.gmail.com> <7587b290910162232se0c399eqe0a39b9832c70be4@mail.gmail.com> <7587b290910190728s7e4841e4n2a40d9844411a913@mail.gmail.com> <1256315468.1606.20.camel@e200601-lin.cambridge.arm.com> Date: Sun, 25 Oct 2009 14:22:00 -0000 Message-ID: <7587b290910250710x719d7fe2w43b709b34a7ea67e@mail.gmail.com> Subject: Re: [PATCH: PR target/41705] Enable if conversion for thumb1 by new HAVE_conditional_execution definition From: Carrot Wei To: Richard Earnshaw , Ian Lance Taylor , gcc-patches@gcc.gnu.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-System-Of-Record: true Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2009-10/txt/msg01527.txt.bz2 Changes done. X86 is such a target that doesn't define the macro HAVE_conditional_executi= on. I did the following testing without new failure: Bootstrap on x86_64. Gcc regression test on x86_64. Gcc regression test on arm emulator with newlib. ChangeLog: 2009-10-25 Wei Guozhi PR target/41705 * target.h (have_conditional_execution): Add a new target hook func= tion. * target-def.h (TARGET_HAVE_CONDITIONAL_EXECUTION): Likewise. * targhooks.h (default_have_conditional_execution): Likewise. * targhooks.c (default_have_conditional_execution): Likewise. * doc/tm.texi (TARGET_HAVE_CONDITIONAL_EXECUTION): Document it. * config/arm/arm.c (TARGET_HAVE_CONDITIONAL_EXECUTION): Define it. (arm_have_conditional_execution): New function. * ifcvt.c (noce_process_if_block, find_if_header, cond_exec_find_if_block, dead_or_predicable): Change the usage of m= acro HAVE_conditional_execution to a target hook call. * recog.c (peephole2_optimize): Likewise. * sched-rgn.c (add_branch_dependences): Likewise. * final.c (asm_insn_count, final_scan_insn): Likewise. * bb-reorder.c (HAVE_conditional_execution): Remove it. thanks Wei Guozhi Index: target.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- target.h (revision 152888) +++ target.h (working copy) @@ -615,6 +615,9 @@ struct gcc_target already been generated. */ bool (* branch_target_register_callee_saved) (bool after_pe_gen); + /* Return true if the target supports conditional execution. */ + bool (* have_conditional_execution) (void); + /* True if the constant X cannot be placed in the constant pool. */ bool (* cannot_force_const_mem) (rtx); Index: target-def.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- target-def.h (revision 152888) +++ target-def.h (working copy) @@ -492,6 +492,7 @@ #define TARGET_BRANCH_TARGET_REGISTER_CLASS \ default_branch_target_register_class #define TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED hook_bool_bool_false +#define TARGET_HAVE_CONDITIONAL_EXECUTION default_have_conditional_executi= on #define TARGET_CANNOT_FORCE_CONST_MEM hook_bool_rtx_false #define TARGET_CANNOT_COPY_INSN_P NULL #define TARGET_COMMUTATIVE_P hook_bool_const_rtx_commutative_p @@ -892,6 +893,7 @@ TARGET_CANNOT_MODIFY_JUMPS_P, \ TARGET_BRANCH_TARGET_REGISTER_CLASS, \ TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED, \ + TARGET_HAVE_CONDITIONAL_EXECUTION, \ TARGET_CANNOT_FORCE_CONST_MEM, \ TARGET_CANNOT_COPY_INSN_P, \ TARGET_COMMUTATIVE_P, \ Index: targhooks.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- targhooks.h (revision 152888) +++ targhooks.h (working copy) @@ -120,3 +120,4 @@ extern bool default_target_option_valid_ extern bool default_target_option_pragma_parse (tree, tree); extern bool default_target_can_inline_p (tree, tree); extern unsigned int default_case_values_threshold (void); +extern bool default_have_conditional_execution (void); Index: targhooks.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- targhooks.c (revision 152888) +++ targhooks.c (working copy) @@ -892,4 +892,14 @@ unsigned int default_case_values_thresho return (HAVE_casesi ? 4 : 5); } +bool +default_have_conditional_execution (void) +{ +#ifdef HAVE_conditional_execution + return HAVE_conditional_execution; +#else + return false; +#endif +} + #include "gt-targhooks.h" Index: tm.texi =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- tm.texi (revision 152888) +++ tm.texi (working copy) @@ -10733,6 +10733,12 @@ to have to make special provisions in @c to reserve space for caller-saved target registers. @end deftypefn +@deftypefn {Target Hook} bool TARGET_HAVE_CONDITIONAL_EXECUTION (void) +This target hook returns true if the target supports conditional execution. +This target hook is required only when the target has several different +modes and they have different conditional execution capability, such as AR= M. +@end deftypefn + @defmac POWI_MAX_MULTS If defined, this macro is interpreted as a signed integer C expression that specifies the maximum number of floating point multiplications Index: arm.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- arm.c (revision 152888) +++ arm.c (working copy) @@ -138,6 +138,7 @@ static rtx arm_libcall_value (enum machi static void arm_internal_label (FILE *, const char *, unsigned long); static void arm_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_IN= T, tree); +static bool arm_have_conditional_execution (void); static bool arm_rtx_costs_1 (rtx, enum rtx_code, int*, bool); static bool arm_size_rtx_costs (rtx, enum rtx_code, enum rtx_code, int *); static bool arm_slowmul_rtx_costs (rtx, enum rtx_code, enum rtx_code, int *, bool); @@ -445,6 +446,9 @@ static const struct attribute_spec arm_a #define TARGET_HAVE_TLS true #endif +#undef TARGET_HAVE_CONDITIONAL_EXECUTION +#define TARGET_HAVE_CONDITIONAL_EXECUTION arm_have_conditional_execution + #undef TARGET_CANNOT_FORCE_CONST_MEM #define TARGET_CANNOT_FORCE_CONST_MEM arm_cannot_force_const_mem @@ -21173,4 +21177,12 @@ arm_frame_pointer_required (void) || (TARGET_ARM && TARGET_APCS_FRAME && ! leaf_function_p ())); } +/* Only thumb1 can't support conditional execution, so return true if + the target is not thumb1. */ +static bool +arm_have_conditional_execution (void) +{ + return !TARGET_THUMB1; +} + #include "gt-arm.h" Index: ifcvt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- ifcvt.c (revision 152888) +++ ifcvt.c (working copy) @@ -47,9 +47,6 @@ #include "vecprim.h" #include "dbgcnt.h" -#ifndef HAVE_conditional_execution -#define HAVE_conditional_execution 0 -#endif #ifndef HAVE_conditional_move #define HAVE_conditional_move 0 #endif @@ -2419,7 +2416,7 @@ noce_process_if_block (struct noce_if_in if (HAVE_conditional_move && noce_try_cmove (if_info)) goto success; - if (! HAVE_conditional_execution) + if (! targetm.have_conditional_execution ()) { if (noce_try_store_flag_constants (if_info)) goto success; @@ -3063,7 +3060,7 @@ find_if_header (basic_block test_bb, int && noce_find_if_block (test_bb, then_edge, else_edge, pass)) goto success; - if (HAVE_conditional_execution && reload_completed + if (targetm.have_conditional_execution () && reload_completed && cond_exec_find_if_block (&ce_info)) goto success; @@ -3073,7 +3070,7 @@ find_if_header (basic_block test_bb, int goto success; if (dom_info_state (CDI_POST_DOMINATORS) >=3D DOM_NO_FAST_QUERY - && (! HAVE_conditional_execution || reload_completed)) + && (! targetm.have_conditional_execution () || reload_completed)) { if (find_if_case_1 (test_bb, then_edge, else_edge)) goto success; @@ -3180,7 +3177,7 @@ cond_exec_find_if_block (struct ce_if_bl /* We only ever should get here after reload, and only if we have conditional execution. */ - gcc_assert (HAVE_conditional_execution && reload_completed); + gcc_assert (targetm.have_conditional_execution () && reload_completed); /* Discover if any fall through predecessors of the current test basic b= lock were && tests (which jump to the else block) or || tests (which jump = to @@ -3858,7 +3855,7 @@ dead_or_predicable (basic_block test_bb, /* Disable handling dead code by conditional execution if the machine ne= eds to do anything funny with the tests, etc. */ #ifndef IFCVT_MODIFY_TESTS - if (HAVE_conditional_execution) + if (targetm.have_conditional_execution ()) { /* In the conditional execution case, we have things easy. We know the condition is reversible. We don't have to check life info Index: recog.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- recog.c (revision 152888) +++ recog.c (working copy) @@ -3267,40 +3267,44 @@ peephole2_optimize (void) do_cleanup_cfg |=3D purge_dead_edges (bb); } -#ifdef HAVE_conditional_execution - for (i =3D 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i) - peep2_insn_data[i].insn =3D NULL_RTX; - peep2_insn_data[peep2_current].insn =3D PEEP2_EOB; - peep2_current_count =3D 0; -#else - /* Back up lifetime information past the end of the - newly created sequence. */ - if (++i >=3D MAX_INSNS_PER_PEEP2 + 1) - i =3D 0; - bitmap_copy (live, peep2_insn_data[i].live_before); - - /* Update life information for the new sequence. */ - x =3D attempt; - do - { - if (INSN_P (x)) - { - if (--i < 0) - i =3D MAX_INSNS_PER_PEEP2; - if (peep2_current_count < MAX_INSNS_PER_PEEP2 - && peep2_insn_data[i].insn =3D=3D NULL_RTX) - peep2_current_count++; - peep2_insn_data[i].insn =3D x; - df_insn_rescan (x); - df_simulate_one_insn_backwards (bb, x, live); - bitmap_copy (peep2_insn_data[i].live_before, live= ); - } - x =3D PREV_INSN (x); - } - while (x !=3D prev); + if (targetm.have_conditional_execution ()) + { + for (i =3D 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i) + peep2_insn_data[i].insn =3D NULL_RTX; + peep2_insn_data[peep2_current].insn =3D PEEP2_EOB; + peep2_current_count =3D 0; + } + else + { + /* Back up lifetime information past the end of the + newly created sequence. */ + if (++i >=3D MAX_INSNS_PER_PEEP2 + 1) + i =3D 0; + bitmap_copy (live, peep2_insn_data[i].live_before); + + /* Update life information for the new sequence. */ + x =3D attempt; + do + { + if (INSN_P (x)) + { + if (--i < 0) + i =3D MAX_INSNS_PER_PEEP2; + if (peep2_current_count < MAX_INSNS_PER_PEEP2 + && peep2_insn_data[i].insn =3D=3D NULL_R= TX) + peep2_current_count++; + peep2_insn_data[i].insn =3D x; + df_insn_rescan (x); + df_simulate_one_insn_backwards (bb, x, live); + bitmap_copy (peep2_insn_data[i].live_before, + live); + } + x =3D PREV_INSN (x); + } + while (x !=3D prev); - peep2_current =3D i; -#endif + peep2_current =3D i; + } /* If we generated a jump instruction, it won't have JUMP_LABEL set. Recompute after we're done. */ Index: sched-rgn.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- sched-rgn.c (revision 152888) +++ sched-rgn.c (working copy) @@ -2508,7 +2508,9 @@ add_branch_dependences (rtx head, rtx ta add_dependence (last, insn, REG_DEP_ANTI); } -#ifdef HAVE_conditional_execution + if (!targetm.have_conditional_execution ()) + return; + /* Finally, if the block ends in a jump, and we are doing intra-block scheduling, make sure that the branch depends on any COND_EXEC insns inside the block to avoid moving the COND_EXECs past the branch insn. @@ -2557,7 +2559,6 @@ add_branch_dependences (rtx head, rtx ta if (INSN_P (insn) && GET_CODE (PATTERN (insn)) =3D=3D COND_EXEC) add_dependence (tail, insn, REG_DEP_ANTI); } -#endif } Index: final.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- final.c (revision 152888) +++ final.c (working copy) @@ -204,10 +204,8 @@ rtx final_sequence; static int dialect_number; #endif -#ifdef HAVE_conditional_execution /* Nonnull if the insn currently being emitted was a COND_EXEC pattern. */ rtx current_insn_predicate; -#endif #ifdef HAVE_ATTR_length static int asm_insn_count (rtx); @@ -2102,10 +2100,9 @@ final_scan_insn (rtx insn, FILE *file, i const char *templ; bool is_stmt; -#ifdef HAVE_conditional_execution /* Reset this early so it is correct for ASM statements. */ current_insn_predicate =3D NULL_RTX; -#endif + /* An INSN, JUMP_INSN or CALL_INSN. First check for special kinds that recog doesn't recognize. */ @@ -2590,10 +2587,9 @@ final_scan_insn (rtx insn, FILE *file, i FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands= ); #endif -#ifdef HAVE_conditional_execution - if (GET_CODE (PATTERN (insn)) =3D=3D COND_EXEC) + if (targetm.have_conditional_execution () + && GET_CODE (PATTERN (insn)) =3D=3D COND_EXEC) current_insn_predicate =3D COND_EXEC_TEST (PATTERN (insn)); -#endif #ifdef HAVE_cc0 cc_prev_status =3D cc_status; Index: bb-reorder.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- bb-reorder.c (revision 152888) +++ bb-reorder.c (working copy) @@ -86,10 +86,6 @@ #include "tree-pass.h" #include "df.h" -#ifndef HAVE_conditional_execution -#define HAVE_conditional_execution 0 -#endif - /* The number of rounds. In most cases there will only be 4 rounds, but when partitioning hot and cold basic blocks into separate sections of the .o file there will be an extra round.*/ On Sat, Oct 24, 2009 at 12:31 AM, Richard Earnshaw wrote: > > On Wed, 2009-10-21 at 20:52 -0700, Ian Lance Taylor wrote: >> Carrot Wei writes: >> >> > +bool default_have_conditional_execution (void) >> > +{ >> >> Line break after "bool". >> >> >> > +/* Only thumb1 can't support conditional execution, so return true if >> > + =A0 the target is not thumb1. =A0*/ >> > +bool >> > +arm_have_conditional_execution (void) >> > +{ >> > + =A0return !TARGET_THUMB1; >> > +} >> > + >> >> Make this function static. =A0Add a static declaration at the top of the >> file near the other static declarations. =A0Define is higher in the >> file, perhaps around the cost functions. >> >> >> > Index: config/arm/arm-protos.h >> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> > --- config/arm/arm-protos.h =A0 =A0 (revision 152888) >> > +++ config/arm/arm-protos.h =A0 =A0 (working copy) >> > @@ -41,7 +41,8 @@ extern HOST_WIDE_INT thumb_compute_initi >> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0unsigned int); >> > =A0extern unsigned int arm_dbx_register_number (unsigned int); >> > =A0extern void arm_output_fn_unwind (FILE *, bool); >> > - >> > +extern bool arm_have_conditional_execution (void); >> >> Do not declare this here. >> >> >> > @@ -146,7 +147,8 @@ extern const char *vfp_output_fstmd (rtx >> > =A0extern void arm_set_return_address (rtx, rtx); >> > =A0extern int arm_eliminable_register (rtx); >> > =A0extern const char *arm_output_shift(rtx *, int); >> > - >> > +extern bool removable_cmp_0 (rtx cmp_op); >> > +extern const char *emit_branch_after_movs (rtx *operands); >> > =A0extern bool arm_output_addr_const_extra (FILE *, rtx); >> >> This seems like an unrelated change which should not be in this patch. >> >> >> Please send a new patch. =A0Please also test the new patch on x86 or >> x86_64 GNU/Linux. >> >> I would like to hear if the ARM maintainers have any comments. >> > > This looks OK to me with the changes Ian has requested. =A0However, it > causes code that was previously conditionalized on > HAVE_conditional_execution to be unconditionally compiled, so please > also make sure that the code builds cleanly for at least one target that > does not define that macro. > > R. > > >