diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 979fb11a284d3907f9221a93db3838493bd0615d..12e36f5b370577f6a366918330808afdc2e362ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-25  Zack Weinberg  <zack@codesourcery.com>
+
+	* basic-block.h (BB_SET_PARTITION): Clear old value first.
+	* cfg.c (clear_bb_flags): Don't clear partition setting.
+
 2004-08-25  Alan Modra  <amodra@bigpond.net.au>
 
 	PR target/17052
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 64dda0404434dce26957217c59792ec0900ca224..19ed577fe553d2fb770947717aba75c206112479 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -318,7 +318,12 @@ typedef struct reorder_block_def
 /* Partitions, to be used when partitioning hot and cold basic blocks into
    separate sections.  */
 #define BB_PARTITION(bb) ((bb)->flags & (BB_HOT_PARTITION|BB_COLD_PARTITION))
-#define BB_SET_PARTITION(bb, part) ((bb)->flags |= (part))
+#define BB_SET_PARTITION(bb, part) do {					\
+  basic_block bb_ = (bb);						\
+  bb_->flags = ((bb_->flags & ~(BB_HOT_PARTITION|BB_COLD_PARTITION))	\
+		| (part));						\
+} while (0)
+
 #define BB_COPY_PARTITION(dstbb, srcbb) \
   BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
 
diff --git a/gcc/cfg.c b/gcc/cfg.c
index d195b10cd4ead88ecc1010e36449c793c4b7a3ba..003d09e05ff28a5e5641c969bb74e90e4a12a203 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -462,13 +462,14 @@ redirect_edge_pred (edge e, basic_block new_pred)
   e->src = new_pred;
 }
 
+/* Clear all basic block flags, with the exception of partitioning.  */
 void
 clear_bb_flags (void)
 {
   basic_block bb;
 
   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
-    bb->flags = 0;
+    bb->flags = BB_PARTITION (bb);
 }
 
 /* Check the consistency of profile information.  We can't do that