diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 676637fcd3648ff8eeb2fc82332364c88d8d1880..b8c9e965d300476c1ffd19e2adb6a07e0bce5ca7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-12  Sebastian Pop  <sebastian.pop@amd.com>
+
+	* tree-parloops.c (loop_has_blocks_with_irreducible_flag): New.
+	(parallelize_loops): Don't parallelize irreducible components.
+
 2008-01-14  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
 	PR c++/24924
diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c
index a6484b5b0c585ea6a71a81811b12496045245333..3b3176c5520f273856a7f06dddee22c14aee8865 100644
--- a/gcc/tree-parloops.c
+++ b/gcc/tree-parloops.c
@@ -431,6 +431,26 @@ loop_parallel_p (struct loop *loop, htab_t reduction_list, struct tree_niter_des
   return ret;
 }
 
+/* Return true when LOOP contains basic blocks marked with the
+   BB_IRREDUCIBLE_LOOP flag.  */
+
+static inline bool
+loop_has_blocks_with_irreducible_flag (struct loop *loop)
+{
+  unsigned i;
+  basic_block *bbs = get_loop_body_in_dom_order (loop);
+  bool res = true;
+
+  for (i = 0; i < loop->num_nodes; i++)
+    if (bbs[i]->flags & BB_IRREDUCIBLE_LOOP)
+      goto end;
+
+  res = false;
+ end:
+  free (bbs);
+  return res;
+}
+
 /* Assigns the address of OBJ in TYPE to an ssa name, and returns this name.
    The assignment statement is placed before LOOP.  DECL_ADDRESS maps decls
    to their addresses that can be reused.  The address of OBJ is known to
@@ -1741,6 +1761,7 @@ parallelize_loops (void)
 	  || expected_loop_iterations (loop) <= n_threads
 	  /* And of course, the loop must be parallelizable.  */
 	  || !can_duplicate_loop_p (loop)
+	  || loop_has_blocks_with_irreducible_flag (loop)
 	  || !loop_parallel_p (loop, reduction_list, &niter_desc))
 	continue;