aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-loop-linear.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-loop-linear.c')
-rw-r--r--gcc/tree-loop-linear.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c
index 3fb4d05..d04045d 100644
--- a/gcc/tree-loop-linear.c
+++ b/gcc/tree-loop-linear.c
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "rtl.h"
#include "basic-block.h"
#include "diagnostic.h"
+#include "obstack.h"
#include "tree-flow.h"
#include "tree-dump.h"
#include "timevar.h"
@@ -253,7 +254,7 @@ linear_transform_loops (void)
VEC(tree,heap) *oldivs = NULL;
VEC(tree,heap) *invariants = NULL;
struct loop *loop_nest;
-
+
FOR_EACH_LOOP (li, loop_nest, 0)
{
unsigned int depth = 0;
@@ -263,6 +264,9 @@ linear_transform_loops (void)
lambda_loopnest before, after;
lambda_trans_matrix trans;
bool problem = false;
+ struct obstack lambda_obstack;
+ gcc_obstack_init (&lambda_obstack);
+
/* If it's not a loop nest, we don't want it.
We also don't handle sibling loops properly,
which are loops of the following form:
@@ -327,7 +331,7 @@ linear_transform_loops (void)
}
before = gcc_loopnest_to_lambda_loopnest (loop_nest, &oldivs,
- &invariants);
+ &invariants, &lambda_obstack);
if (!before)
goto free_and_continue;
@@ -338,7 +342,7 @@ linear_transform_loops (void)
print_lambda_loopnest (dump_file, before, 'i');
}
- after = lambda_loopnest_transform (before, trans);
+ after = lambda_loopnest_transform (before, trans, &lambda_obstack);
if (dump_file)
{
@@ -347,13 +351,14 @@ linear_transform_loops (void)
}
lambda_loopnest_to_gcc_loopnest (loop_nest, oldivs, invariants,
- after, trans);
+ after, trans, &lambda_obstack);
modified = true;
if (dump_file)
fprintf (dump_file, "Successfully transformed loop.\n");
free_and_continue:
+ obstack_free (&lambda_obstack, NULL);
free_dependence_relations (dependence_relations);
free_data_refs (datarefs);
}