PR tree-optimization/34371
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Dec 2007 22:49:43 +0000 (22:49 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Dec 2007 22:49:43 +0000 (22:49 +0000)
* tree-vectorizer.h (struct _loop_vec_info): Add num_iters_unchanged
field.
(LOOP_VINFO_NITERS_UNCHANGED): Define to num_iters_unchanged field.
* tree-vectorizer.c (set_prologue_iterations,
slpeel_tree_peel_loop_to_edge): Call unshare_expr on
LOOP_VINFO_NITERS_UNCHANGED before using it.

* gcc.c-torture/compile/20071207-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130755 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20071207-1.c [new file with mode: 0644]
gcc/tree-vectorizer.c
gcc/tree-vectorizer.h

index c57f46e..c2c0154 100644 (file)
@@ -1,3 +1,13 @@
+2007-12-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/34371
+       * tree-vectorizer.h (struct _loop_vec_info): Add num_iters_unchanged
+       field.
+       (LOOP_VINFO_NITERS_UNCHANGED): Define to num_iters_unchanged field.
+       * tree-vectorizer.c (set_prologue_iterations,
+       slpeel_tree_peel_loop_to_edge): Call unshare_expr on
+       LOOP_VINFO_NITERS_UNCHANGED before using it.
+
 2007-12-10  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR target/34403
index 099f029..4774d30 100644 (file)
@@ -1,3 +1,8 @@
+2007-12-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/34371
+       * gcc.c-torture/compile/20071207-1.c: New test.
+
 2007-12-10  Simon Martin  <simartin@users.sourceforge.net>
 
        PR c++/34059
diff --git a/gcc/testsuite/gcc.c-torture/compile/20071207-1.c b/gcc/testsuite/gcc.c-torture/compile/20071207-1.c
new file mode 100644 (file)
index 0000000..27b8716
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR tree-optimization/34371 */
+/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
+
+void centerln (int width, int ch, char *s)
+{
+  unsigned int sidebar;
+  int i;
+  char linet1[1000];
+  char linet2[100];
+  sidebar = (width - __builtin_strlen (s)) / 2;
+  for (i = 0; i < sidebar; i++)
+    linet2[i] = ch;
+  __builtin_strcpy (linet1, linet2);
+}
index fcc7416..0131b9a 100644 (file)
@@ -1037,7 +1037,7 @@ set_prologue_iterations (basic_block bb_before_first_loop,
   tree gimplify_stmt_list;
   tree cost_pre_condition = NULL_TREE;
   tree scalar_loop_iters = 
-    LOOP_VINFO_NITERS_UNCHANGED (loop_vec_info_for_loop (loop));
+    unshare_expr (LOOP_VINFO_NITERS_UNCHANGED (loop_vec_info_for_loop (loop)));
 
   e = single_pred_edge (bb_before_first_loop);
   cond_bb = split_edge(e);
@@ -1154,8 +1154,6 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop,
   edge exit_e = single_exit (loop);
   LOC loop_loc;
   tree cost_pre_condition = NULL_TREE;
-  tree scalar_loop_iters = 
-    LOOP_VINFO_NITERS_UNCHANGED (loop_vec_info_for_loop (loop));
   
   if (!slpeel_can_duplicate_loop_p (loop, e))
     return NULL;
@@ -1307,10 +1305,13 @@ slpeel_tree_peel_loop_to_edge (struct loop *loop,
                     build_int_cst (TREE_TYPE (first_niters), 0));
       if (check_profitability)
        {
-           cost_pre_condition = 
+         tree scalar_loop_iters
+           = unshare_expr (LOOP_VINFO_NITERS_UNCHANGED
+                                       (loop_vec_info_for_loop (loop)));
+         cost_pre_condition = 
            build2 (LE_EXPR, boolean_type_node, scalar_loop_iters, 
                    build_int_cst (TREE_TYPE (scalar_loop_iters), th));
-  
+
          pre_condition = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
                                       cost_pre_condition, pre_condition);
        }
index d7d4476..0f3c34e 100644 (file)
@@ -164,6 +164,7 @@ typedef struct _loop_vec_info {
 
   /* Number of iterations.  */
   tree num_iters;
+  tree num_iters_unchanged;
 
   /* Minimum number of iterations below which vectorization is expected to
      not be profitable (as estimated by the cost model). 
@@ -230,7 +231,7 @@ typedef struct _loop_vec_info {
 #define LOOP_VINFO_NITERS(L)          (L)->num_iters
 /* Since LOOP_VINFO_NITERS can change after prologue peeling
    retain total unchanged scalar loop iterations for cost model.  */
-#define LOOP_VINFO_NITERS_UNCHANGED(L)          (L)->num_iters
+#define LOOP_VINFO_NITERS_UNCHANGED(L)          (L)->num_iters_unchanged
 #define LOOP_VINFO_COST_MODEL_MIN_ITERS(L)     (L)->min_profitable_iters
 #define LOOP_VINFO_VECTORIZABLE_P(L)  (L)->vectorizable
 #define LOOP_VINFO_VECT_FACTOR(L)     (L)->vectorization_factor