|
From: Andrea C. O. <and...@gm...> - 2010-03-09 18:10:33
|
Hi,
Sorry for the late replay.
I have left only one remark (Gabriele and Erven already addressed all
the others).
We should probably avoid the changes in gcc/opts.c
the right way of doing it is by defining OPTIMIZATION_OPTIONS in
cil32.h as we did for OVERRIDE_OPTIONS
You can look for an example on how to use them to gcc/config/cris/cris.[hc]
it defines both OPTIMIZATION_OPTIONS and OVERRIDE_OPTIONS
I do not remember exactly the difference of the two, so I do not know
exactly where to put it, but the option does not exists for other
targets.
Andrea
On Mon, Mar 8, 2010 at 5:39 PM, Thierry Lafage <thi...@in...> wrote:
> Hi all,
>
> Here are several small patches for our gcc4cli BE branch:
>
> pr19340.c.patch is to avoid testing with pr19340.c because it has no sense
> in cil32 since it tests the scheduler.
> gcc4cli_line_info-t-cil32.patch fixes dependencies in t-cil32 and adds the
> file source-location.h which was introduced in my last patch concerning
> source location (this t-cil32 patch should have been part of the source
> location patch).
> cil-lower.c.patch modifies the pass gate in order to activate this pass only
> when -ftree_vectorize option is activated (which is the case in -O3)
> and simp-cond.patch is a simplification of the simp-cond pass which also
> makes it more complete (adds support for brtrue/brfalse and for floating
> point comparisons in conditional branches + add a command-line option which
> is activated in -O1 + fixes missing brtrue/brfalse as being conditional
> branch instructions). Note that this pass either does nothing, or change a
> branch condition instruction into another one (inverts the condition) and
> removes the following unconditional branch. This means that the stack is not
> changed at all, so I removed all the stuff that was recomputing the stack at
> every statement. Moreover, I didn't understand the test on the conditional
> branch operand type (integer or pointer) in order to change the conditional
> br instruction: I've removed it and tested on a real program, and it seems
> to be ok. More tests are on the way (check-gcc + cbenchmarks).
>
> Feel free to comment. I should commit in a few days if you're ok (or if you
> don't say anything).
>
> Regards,
>
> Thierry Lafage.
>
> Index: gcc/config/cil32/cil-lower.c
> ===================================================================
> --- gcc/config/cil32/cil-lower.c (revision 156016)
> +++ gcc/config/cil32/cil-lower.c (working copy)
> @@ -1,6 +1,6 @@
> /* CIL IR lowering.
>
> - Copyright (C) 2009 Free Software Foundation, Inc.
> + Copyright (C) 2009-2010 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -23,11 +23,13 @@
> Andrea C. Ornstein
> Erven Rohou
> Gabriele Svelto
> + Thierry Lafage
>
> Contact information at STMicroelectronics:
> Andrea C. Ornstein <and...@st...>
> Contact information at INRIA:
> Erven Rohou <erv...@in...>
> +Thierry Lafage <thi...@in...>
> */
>
> #include <stdio.h>
> @@ -52,6 +54,8 @@
> * Globals
> *
> ******************************************************************************/
>
> +extern int flag_tree_vectorize; // TL // This avoids including options.h
> +
> enum simd_backend simd_type = UNDEF_SIMD;
>
> /******************************************************************************
> @@ -591,8 +595,7 @@
> static bool
> lower_cil_gate (void)
> {
> - /* FIXME: should lower only if vector types are handled in this funtion.
> */
> - return true;
> + return flag_tree_vectorize != 0;
> }
>
>
>
> Index: gcc/config/cil32/t-cil32
> ===================================================================
> --- gcc/config/cil32/t-cil32 (revision 156016)
> +++ gcc/config/cil32/t-cil32 (working copy)
> @@ -110,6 +110,7 @@
> $(srcdir)/config/cil32/cil-stmt.h \
> $(srcdir)/config/cil32/cil-types.h \
> $(srcdir)/config/cil32/emit-cil.h \
> + $(srcdir)/config/cil32/source-location.h \
> $(CONFIG_H) $(FLAGS_H) $(GGC_H) \
> $(SYSTEM_H) $(TIMEVAR_H) $(TM_H) $(TREE_H) $(TREE_FLOW_H) $(TREE_PASS_H)
> \
> coretypes.h errors.h pointer-set.h
> @@ -134,6 +135,7 @@
> missing-protos.o : $(srcdir)/config/cil32/missing-protos.c \
> $(srcdir)/config/cil32/cil-refs.h $(srcdir)/config/cil32/cil-stmt.h \
> $(srcdir)/config/cil32/cil-stmt-inline.h
> $(srcdir)/config/cil32/cil-stack.h \
> + $(srcdir)/config/cil32/source-location.h \
> $(srcdir)/config/cil32/cil-types.h $(CONFIG_H) $(FLAGS_H) $(SYSTEM_H) \
> $(TIMEVAR_H) $(TM_H) $(TREE_H) $(TREE_PASS_H) coretypes.h errors.h \
> pointer-set.h
>
> Index: gcc/testsuite/gcc.dg/pr19340.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/pr19340.c (revision 156016)
> +++ gcc/testsuite/gcc.dg/pr19340.c (working copy)
> @@ -1,6 +1,6 @@
> /* { dg-do compile } */
> /* { dg-options "-O1 -fschedule-insns2 -fsched2-use-traces" } */
> -/* { dg-skip-if "No scheduling" { mmix-*-* cris-*-* crisv32-*-* fido-*-*
> m68k-*-* m32c-*-* avr-*-* } { "*" } { "" } } */
> +/* { dg-skip-if "No scheduling" { mmix-*-* cris-*-* crisv32-*-* fido-*-*
> m68k-*-* m32c-*-* avr-*-* cil32-*-* } { "*" } { "" } } */
>
> extern double f (double x);
>
>
> Index: gcc/opts.c
> ===================================================================
> --- gcc/opts.c (revision 156016)
> +++ gcc/opts.c (working copy)
> @@ -914,6 +914,7 @@
> flag_tree_copy_prop = opt1;
> flag_tree_sink = opt1;
> flag_tree_ch = opt1;
> + flag_cil32_simp_cond = opt1;
>
> /* -O2 optimizations. */
> opt2 = (optimize >= 2);
> Index: gcc/config/cil32/cil32.opt
> ===================================================================
> --- gcc/config/cil32/cil32.opt (revision 156016)
> +++ gcc/config/cil32/cil32.opt (working copy)
> @@ -77,3 +77,7 @@
> msimd=
> Target Joined RejectNegative Var(simd_backend_str)
> -msimd=gcc|mono Select the SIMD backend
> +
> +fcil32simpcond
> +Target Report Var(flag_cil32_simp_cond) Optimization ; added to -O1
> +Enable simplification of conditional expressions to make use of the fall
> through path when possible
> Index: gcc/config/cil32/simp-cond.c
> ===================================================================
> --- gcc/config/cil32/simp-cond.c (revision 156016)
> +++ gcc/config/cil32/simp-cond.c (working copy)
> @@ -2,7 +2,7 @@
> conditional/unconditional branches if one of the two outgoing paths falls
> through to the next basic block.
>
> - Copyright (C) 2006-2009 Free Software Foundation, Inc.
> + Copyright (C) 2006-2010 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -25,11 +25,13 @@
> Andrea Ornstein
> Erven Rohou
> Gabriele Svelto
> + Thierry Lafage
>
> Contact information at STMicroelectronics:
> Andrea C. Ornstein <and...@st...>
> Contact information at INRIA:
> Erven Rohou <erv...@in...>
> +Thierry Lafage <thi...@in...>
> */
>
> #include "config.h"
> @@ -45,11 +47,13 @@
> #include "cil-stmt.h"
> #include "cil-types.h"
>
> +extern int flag_cil32_simp_cond;
> +
> /******************************************************************************
> * Local functions prototypes
> *
> ******************************************************************************/
>
> -static void simplify_cond_branch (cil_stmt_iterator *, cil_stack);
> +static void simplify_cond_branch (cil_stmt_iterator *);
> static unsigned int simp_cond (void);
> static bool simp_cond_gate (void);
>
> @@ -58,17 +62,18 @@
> ******************************************************************************/
>
> static void
> -simplify_cond_branch (cil_stmt_iterator *csi, cil_stack stack)
> +simplify_cond_branch (cil_stmt_iterator *csi)
> {
> cil_stmt stmt;
> - cil_type_t type;
> enum cil_opcode opcode;
> tree label_then, label_else;
> - basic_block then_bb;
> + basic_block cur_bb, then_bb;
> edge true_edge, false_edge;
>
> + cur_bb = csi_bb (*csi);
> +
> /* Extract the condition's edges. */
> - extract_true_false_edges_from_block (csi_bb (*csi), &true_edge,
> &false_edge);
> + extract_true_false_edges_from_block (cur_bb, &true_edge, &false_edge);
> label_then = gimple_block_label (true_edge->dest);
> label_else = gimple_block_label (false_edge->dest);
>
> @@ -76,37 +81,34 @@
>
> /* Simplify the condition only if the 'then' edge can be turned into a
> fall through to the next basic block. */
> - if (csi_bb (*csi)->next_bb == then_bb)
> + if (cur_bb->next_bb == then_bb)
> {
> - type = cil_stack_top (stack);
> -
> - if (cil_integer_p (type) || cil_pointer_p (type))
> + switch (cil_opcode (csi_stmt (*csi)))
> {
> - switch (cil_opcode (csi_stmt (*csi)))
> - {
> - case CIL_BEQ: opcode = CIL_BNE_UN; break;
> - case CIL_BGE: opcode = CIL_BLT; break;
> - case CIL_BGE_UN: opcode = CIL_BLT_UN; break;
> - case CIL_BGT: opcode = CIL_BLE; break;
> - case CIL_BGT_UN: opcode = CIL_BLE_UN; break;
> - case CIL_BLE: opcode = CIL_BGT; break;
> - case CIL_BLE_UN: opcode = CIL_BGT_UN; break;
> - case CIL_BLT: opcode = CIL_BGE; break;
> - case CIL_BLT_UN: opcode = CIL_BGE_UN; break;
> - case CIL_BNE_UN: opcode = CIL_BEQ; break;
> - default:
> - return; /* Do nothing, we cannot change this branch. */
> - }
> + case CIL_BEQ: opcode = CIL_BNE_UN; break;
> + case CIL_BGE: opcode = CIL_BLT; break;
> + case CIL_BGE_UN: opcode = CIL_BLT_UN; break;
> + case CIL_BGT: opcode = CIL_BLE; break;
> + case CIL_BGT_UN: opcode = CIL_BLE_UN; break;
> + case CIL_BLE: opcode = CIL_BGT; break;
> + case CIL_BLE_UN: opcode = CIL_BGT_UN; break;
> + case CIL_BLT: opcode = CIL_BGE; break;
> + case CIL_BLT_UN: opcode = CIL_BGE_UN; break;
> + case CIL_BNE_UN: opcode = CIL_BEQ; break;
> + case CIL_BRTRUE: opcode = CIL_BRFALSE; break;
> + case CIL_BRFALSE: opcode = CIL_BRTRUE; break;
> + default:
> + return; /* Do nothing, we cannot change this branch. */
> + }
>
> - stmt = cil_build_stmt_arg (opcode, label_else);
> - csi_replace (csi, stmt);
> - csi_next (csi);
> - csi_remove (csi);
> + stmt = cil_build_stmt_arg (opcode, label_else);
> + csi_replace (csi, stmt);
> + csi_next (csi);
> + csi_remove (csi);
>
> - /* Invert the out-going edges */
> - true_edge->flags ^= (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
> - false_edge->flags ^= (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
> - }
> + /* Invert the out-going edges */
> + true_edge->flags ^= (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
> + false_edge->flags ^= (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
> }
> }
>
> @@ -120,23 +122,14 @@
> basic_block bb;
> cil_stmt_iterator csi;
> cil_stmt stmt;
> - enum cil_opcode opcode;
> - cil_bb_stacks bbs;
> - cil_stack stack;
> - edge_iterator ei;
> - edge e;
> -
> - bbs = cil_bb_stacks_create ();
>
> FOR_EACH_BB (bb)
> {
> - stack = cil_stack_for_bb (bbs, bb);
> csi = csi_start_bb (bb);
>
> while (!csi_end_p (csi))
> {
> stmt = csi_stmt (csi);
> - opcode = cil_opcode (stmt);
>
> if (cil_cond_branch_p (stmt) && !csi_one_before_end_p (csi))
> {
> @@ -145,22 +138,15 @@
> if (cil_opcode (csi_stmt (csi)) == CIL_BR)
> {
> csi_prev (&csi);
> - simplify_cond_branch (&csi, stack);
> + simplify_cond_branch (&csi);
> break;
> }
> }
>
> - cil_stack_after_stmt (stack, stmt);
> csi_next (&csi);
> }
> -
> - FOR_EACH_EDGE (e, ei, bb->succs)
> - {
> - cil_set_stack_for_bb (bbs, e->dest, stack);
> - }
> }
>
> - cil_bb_stacks_destroy (bbs);
> return 0;
> }
>
> @@ -169,7 +155,7 @@
> static bool
> simp_cond_gate (void)
> {
> - return true;
> + return flag_cil32_simp_cond != 0;
> }
>
> /* Define the parameters of the cond-simp pass. */
> Index: gcc/config/cil32/cil-stmt.c
> ===================================================================
> --- gcc/config/cil32/cil-stmt.c (revision 156016)
> +++ gcc/config/cil32/cil-stmt.c (working copy)
> @@ -1,6 +1,6 @@
> /* CIL statements, sequences and iterators implementation.
>
> - Copyright (C) 2006-2009 Free Software Foundation, Inc.
> + Copyright (C) 2006-2010 Free Software Foundation, Inc.
>
> This file is part of GCC.
>
> @@ -23,11 +23,13 @@
> Andrea Ornstein
> Erven Rohou
> Gabriele Svelto
> + Thierry Lafage
>
> Contact information at STMicroelectronics:
> Andrea C. Ornstein <and...@st...>
> Contact information at INRIA:
> Erven Rohou <erv...@in...>
> +Thierry Lafage <thi...@in...>
> */
>
> #include "config.h"
> @@ -502,7 +504,9 @@
> case CIL_BLT:
> case CIL_BLT_UN:
> case CIL_BNE_UN:
> - return true;
> + case CIL_BRFALSE:
> + case CIL_BRTRUE:
> + return true;
>
> default:
> return false;
>
> ------------------------------------------------------------------------------
> Download Intel® Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
> _______________________________________________
> Gcc4cli-devel mailing list
> Gcc...@li...
> https://lists.sourceforge.net/lists/listinfo/gcc4cli-devel
>
>
|