diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0ec0c60cf01c00df3a58d5e7ac30958bd3ca4d8c..0aed70c980ed06a32695f74eab5077aa90efc444 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-11-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+	PR target/10127
+	PR ada/20548
+	* config/i386/i386.md (probe_stack_range): New expander.
+	(logical operation peepholes): Do not split stack checking probes.
+
 2009-11-04  Harsha Jagasia  <harsha.jagasia@amd.com>
 	    Dwarakanath Rajagopal  <dwarak.rajagopal@amd.com>
 
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index c011d9b434707e94f593b6a211717f7f981b59fb..82f5352597c22a034d9a4fc4be20350e5e3530ca 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -20023,6 +20023,18 @@
   DONE;
 })
 
+;; Use IOR for stack probes, this is shorter.
+(define_expand "probe_stack"
+  [(match_operand 0 "memory_operand" "")]
+  ""
+{
+  if (GET_MODE (operands[0]) == DImode)
+    emit_insn (gen_iordi3 (operands[0], operands[0], const0_rtx));
+  else
+    emit_insn (gen_iorsi3 (operands[0], operands[0], const0_rtx));
+  DONE;
+})
+
 (define_expand "builtin_setjmp_receiver"
   [(label_ref (match_operand 0 "" ""))]
   "!TARGET_64BIT && flag_pic"
@@ -20526,7 +20538,9 @@
                      [(match_dup 0)
                       (match_operand:SI 1 "nonmemory_operand" "")]))
               (clobber (reg:CC FLAGS_REG))])]
-  "optimize_insn_for_speed_p () && ! TARGET_READ_MODIFY_WRITE"
+  "optimize_insn_for_speed_p () && ! TARGET_READ_MODIFY_WRITE
+   /* Do not split stack checking probes.  */
+   && GET_CODE (operands[3]) != IOR && operands[1] != const0_rtx"
   [(set (match_dup 2) (match_dup 0))
    (parallel [(set (match_dup 2)
                    (match_op_dup 3 [(match_dup 2) (match_dup 1)]))
@@ -20541,7 +20555,9 @@
                      [(match_operand:SI 1 "nonmemory_operand" "")
                       (match_dup 0)]))
               (clobber (reg:CC FLAGS_REG))])]
-  "optimize_insn_for_speed_p () && ! TARGET_READ_MODIFY_WRITE"
+  "optimize_insn_for_speed_p () && ! TARGET_READ_MODIFY_WRITE
+   /* Do not split stack checking probes.  */
+   && GET_CODE (operands[3]) != IOR && operands[1] != const0_rtx"
   [(set (match_dup 2) (match_dup 0))
    (parallel [(set (match_dup 2)
                    (match_op_dup 3 [(match_dup 1) (match_dup 2)]))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3066e3d17ff47aab9d034abacbdc9c2b42b1fbcf..5f63688f2fcc8a18ebaefb9f826af2a05a38e77e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+	PR ada/20548
+	* ada/acats/norun.lst: Remove the stack checking tests.
+	* ada/acats/run_acats: Limit the stack to 8MB.
+
 2009-11-04  Janus Weil  <janus@gcc.gnu.org>
 
 	PR fortran/41556
diff --git a/gcc/testsuite/ada/acats/norun.lst b/gcc/testsuite/ada/acats/norun.lst
index 8441024b241a6943d3f43d88ba2cf13ce7149e43..c0b08e42c07a43ae688d6b83c945e550044c8351 100644
--- a/gcc/testsuite/ada/acats/norun.lst
+++ b/gcc/testsuite/ada/acats/norun.lst
@@ -1,10 +1,2 @@
-c52103x
-c52104x
-c52104y
-cb1010a
-cb1010c
-cb1010d
 templat
 # Tests must be sorted in alphabetical order
-# c52103x, c52104x, c52104y: -fstack-check doesn't work, PR middle-end/20548
-# cb1010a, cb1010c, cb1010d: likewise
diff --git a/gcc/testsuite/ada/acats/run_acats b/gcc/testsuite/ada/acats/run_acats
index 05f3ff57df5d91fb7eee31ae8a846cc9d848b889..acb6ab5715190757e905252bcdff5f080e3b1361 100755
--- a/gcc/testsuite/ada/acats/run_acats
+++ b/gcc/testsuite/ada/acats/run_acats
@@ -52,4 +52,7 @@ echo exec gnatmake '"$@"' >> host_gnatmake
 
 chmod +x host_gnatmake
 
+# Limit the stack to 8MB for stack checking
+ulimit -s 8192
+
 exec $testdir/run_all.sh ${1+"$@"}