diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f3ba578fd78b001c47c5917860ed5a2317d6aae1..1c218f09a2d8e83fb61330dfc19edee0a4cdb234 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-04-16  Joseph S. Myers  <joseph@codesourcery.com>
+
+	PR middle-end/20491
+	* config/ia64/ia64.c (rtx_needs_barrier): Recurse instead of
+	falling through from SUBREG case to REG.
+
 2005-04-15  Roger Sayle  <roger@eyesopen.com>
 
 	* fold-const.c (fold_relational_hi_lo): Delete function and prototype.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 55fde10d029b828c8db8290cf69810b50cbc5d13..82dff03f36c79c389ab3eee2d99494287087c258 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -5196,8 +5196,8 @@ rtx_needs_barrier (rtx x, struct reg_flags flags, int pred)
       break;
 
     case SUBREG:
-      x = SUBREG_REG (x);
-      /* FALLTHRU */
+      need_barrier |= rtx_needs_barrier (SUBREG_REG (x), flags, pred);
+      break;
     case REG:
       if (REGNO (x) == AR_UNAT_REGNUM)
 	{