diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 26b8c938bd546b2633164c20d9e1f909aa00f2c3..37223ec2e62c2f72d959f19c7d3eaff975b10802 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,35 @@
+2009-01-13  Daniel Jacobowitz  <dan@codesourcery.com>
+	    Nathan Froyd  <froydnj@codesourcery.com>
+	    Joseph Myers  <joseph@codesourcery.com>
+
+	* gcc.target/powerpc/altivec-consts.c: Run if vmx_hw, compile
+	otherwise.  Do not check for AltiVec at runtime.
+	* gcc.target/powerpc/altivec-varargs-1.c: Likewise.
+	* gcc.target/powerpc/altivec-vec-merge.c: Likewise.
+	* gcc.target/powerpc/altivec-1.c: Likewise.
+	* gcc.target/powerpc/altivec-3.c: Likewise.
+	* gcc.target/powerpc/altivec-10.c: Likewise.
+	* gcc.target/powerpc/altivec-12.c: Likewise.
+	* gcc.target/powerpc/altivec-24.c: Likewise.
+	* gcc.target/powerpc/altivec-cell-2.c: Likewise.
+	* gcc.target/powerpc/altivec-cell-3.c: Likewise.
+	* gcc.target/powerpc/altivec-cell-4.c: Likewise.
+	* gcc.target/powerpc/pr35907.c: Likewise.
+	* gcc.target/powerpc/altivec-cell-8.c: Run if cell_hw, compile
+	otherwise.  Do not check for Cell at runtime.
+	* gcc.target/powerpc/altivec_check.h: Delete.
+
+	* g++.dg/ext/altivec-2.C: Do not check for AltiVec at runtime.
+	* g++.dg/ext/altivec-3.C: Run if vmx_hw, compile otherwise.  Do
+	not check for AltiVec at runtime.
+	* g++.dg/ext/altivec-cell-2.C: Likewise.
+	* g++.dg/ext/altivec-cell-3.C: Likewise.
+	* g++.dg/ext/altivec-cell-4.C: Likewise.
+	* g++.dg/eh/simd-2.C: Only use -maltivec if vmx_hw.
+	* g++.dg/eh/check-vect.h (sig_ill_handler): Remove AltiVec runtime
+	check.
+	* g++.dg/ext/altivec_check.h: Delete.
+	
 2009-01-13  Nathan Froyd  <froydnj@codesourcery.com>
 
 	* gcc.target/powerpc/altivec-macros.c: Require a powerpc_altivec_ok
diff --git a/gcc/testsuite/g++.dg/eh/check-vect.h b/gcc/testsuite/g++.dg/eh/check-vect.h
index 4321be0a4a650a395ec13850c3f80e30a5edf7e5..b46a8827598a6af5de8939e845b2574731098776 100644
--- a/gcc/testsuite/g++.dg/eh/check-vect.h
+++ b/gcc/testsuite/g++.dg/eh/check-vect.h
@@ -13,10 +13,7 @@ sig_ill_handler (int sig)
 void check_vect (void)
 {
   signal(SIGILL, sig_ill_handler);
-#if defined(__ppc__) || defined(__ppc64__) || defined(__powerpc__) || defined(powerpc)
-  /* Altivec instruction, 'vor %v0,%v0,%v0'.  */
-  asm volatile (".long 0x10000484");
-#elif defined(__i386__) || defined(__x86_64__)
+#if defined(__i386__) || defined(__x86_64__)
   /* SSE2 instruction: movsd %xmm0,%xmm0 */
   asm volatile (".byte 0xf2,0x0f,0x10,0xc0");
 #elif defined(__sparc__)
diff --git a/gcc/testsuite/g++.dg/eh/simd-2.C b/gcc/testsuite/g++.dg/eh/simd-2.C
index e2af86636acbe6d922f22a2bcc4388a709e080c6..b4c8690e9de45b872630016d50d4c0f1e22fb19b 100644
--- a/gcc/testsuite/g++.dg/eh/simd-2.C
+++ b/gcc/testsuite/g++.dg/eh/simd-2.C
@@ -3,9 +3,7 @@
 // { dg-options "-O" }
 // { dg-options "-O -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
 // { dg-options "-O -w" { target powerpc*-*-* } }
-// { dg-options "-O -w -maltivec" { target { powerpc*-*-linux* && powerpc_altivec_ok } } }
-// { dg-options "-O -w -maltivec" { target { powerpc*-*-darwin* && powerpc_altivec_ok } } }
-// { dg-xfail-if "" { "powerpc-*-eabispe*" "powerpc-ibm-aix*" } { "*" } { "" } }
+// { dg-options "-O -w -maltivec" { target { powerpc*-*-* && vmx_hw } } }
 // { dg-do run }
 
 #include "check-vect.h"
diff --git a/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc/testsuite/g++.dg/ext/altivec-2.C
index 268ff9989464dca3eb91b365e11ecf5950bddd6d..299693694f6f4e0e7977fac5a89a45a1066f059c 100644
--- a/gcc/testsuite/g++.dg/ext/altivec-2.C
+++ b/gcc/testsuite/g++.dg/ext/altivec-2.C
@@ -6,7 +6,6 @@
    arguments.  */
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 int main (int argc, const char * argv[])
 {
@@ -15,8 +14,6 @@ int main (int argc, const char * argv[])
   vector float v;
   const vector float cv = (vector float){1.0, 2.0, 3.0, 4.0};
 
-  altivec_check ();
-
   vec_dst(&cv, i, 0);
   v = vec_ld(0, &cv);	
   v = vec_lde(0, &cf);
diff --git a/gcc/testsuite/g++.dg/ext/altivec-3.C b/gcc/testsuite/g++.dg/ext/altivec-3.C
index d42303d8140d79ca5ad9297a2cc0b3eb5f72e239..151132059508e04ce65351bdc5b09ed5877ecd76 100644
--- a/gcc/testsuite/g++.dg/ext/altivec-3.C
+++ b/gcc/testsuite/g++.dg/ext/altivec-3.C
@@ -1,4 +1,5 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
@@ -10,7 +11,6 @@
 #include <stdlib.h>
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 #define CHECK_INVARIANT(expr) \
   if (!(expr)) { \
@@ -132,7 +132,6 @@ void main1(void)
 
 int main(void)
 {
-    altivec_check();
     main1();
     return 0;
 }
diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-2.C b/gcc/testsuite/g++.dg/ext/altivec-cell-2.C
index 969cc97aa8a6d4224953acd118f78433fd8995f4..f0d3433cdd99fd87fb6e987a404dee290fce335d 100644
--- a/gcc/testsuite/g++.dg/ext/altivec-cell-2.C
+++ b/gcc/testsuite/g++.dg/ext/altivec-cell-2.C
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 /* Test the vec_extract VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
 
 extern "C" void abort (void);
 
@@ -137,6 +137,5 @@ int main1(void)
 
 int main(void)
 { 
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 ();
 }
diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-3.C b/gcc/testsuite/g++.dg/ext/altivec-cell-3.C
index f7ebcae054ea9bb3b4eafcc6d1b1413ca2f3f133..bd7e774e3cdc6ff6a1e6d79018743b6912b69204 100644
--- a/gcc/testsuite/g++.dg/ext/altivec-cell-3.C
+++ b/gcc/testsuite/g++.dg/ext/altivec-cell-3.C
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 /* Test the vec_splats and vec_promote VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
     
 extern "C" void abort (void);
         
@@ -33,6 +33,5 @@ int main1(int t)
     
 int main(void)
 { 
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 (0);
 }
diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-4.C b/gcc/testsuite/g++.dg/ext/altivec-cell-4.C
index 10ab162dad2ea3034614dd6f810fb8ee706bbc0d..7d91adbb34e71be8369ac68d8269a7cafe3fff03 100644
--- a/gcc/testsuite/g++.dg/ext/altivec-cell-4.C
+++ b/gcc/testsuite/g++.dg/ext/altivec-cell-4.C
@@ -1,10 +1,10 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
 /* Test the vec_splats and vec_promote VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
     
 extern "C" void abort (void);
         
@@ -38,6 +38,5 @@ int main1(int t)
   
 int main(void)
 {
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 (0);
 }
diff --git a/gcc/testsuite/g++.dg/ext/altivec_check.h b/gcc/testsuite/g++.dg/ext/altivec_check.h
deleted file mode 100644
index 9e8b3f78ac2b9a72d7e5adfd1ca5e8b901410de8..0000000000000000000000000000000000000000
--- a/gcc/testsuite/g++.dg/ext/altivec_check.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* A runtime check for AltiVec capability.  */
-/* Contributed by Ziemowit Laski  <zlaski@apple.com>  */
-
-#include <signal.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-void exit(int);
-
-void 
-sig_ill_handler (int sig)
-{
-    exit (0);
-}
-
-void altivec_check(void) {
-
-  /* Exit on systems without AltiVec.  */
-  signal (SIGILL, sig_ill_handler);
-#ifdef __MACH__
-  asm volatile ("vor v0,v0,v0");
-#else
-  asm volatile ("vor 0,0,0");
-#endif
-  signal (SIGILL, SIG_DFL);
-}
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-1.c b/gcc/testsuite/gcc.target/powerpc/altivec-1.c
index f235e7b57ac4d8ec100b45c59c8596c8926dfe46..b1809fe2c9c240de71815404c3ef57637ab3ba46 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-1.c
@@ -1,11 +1,11 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
 /* Program to test PowerPC AltiVec instructions.  */
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 extern void abort (void);
 
@@ -24,8 +24,6 @@ vector float f, g, h;
 
 int main ()
 {
-  altivec_check();  /* Exits if AltiVec not supported */
-
   k = vec_add (a1, a2);
   if (!vec_all_eq (addi, k))
     abort ();
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-10.c b/gcc/testsuite/gcc.target/powerpc/altivec-10.c
index 82b3f45a391ea71685e743aa23303aee58ed243a..f532eebbfab0b67ce1bbdb636989a1c84c814e9a 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-10.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-10.c
@@ -1,11 +1,12 @@
-/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec -mabi=altivec -fno-inline" } */
 
 #include <altivec.h>
-#include <signal.h>
 
-#include "altivec_check.h"
+extern void exit (int);
+extern void abort (void);
 
 typedef union
 {
@@ -72,8 +73,6 @@ check_cmple()
 int 
 main()
 {
-  altivec_check ();
-
   check_cmple ();
   check_vec_all_num ();
   exit (0);
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-12.c b/gcc/testsuite/gcc.target/powerpc/altivec-12.c
index 296a3f7510a65f998727b9d47091cc293218be35..39d26940d4e36928d96d880f8bd86b4f6f0616af 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-12.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-12.c
@@ -1,11 +1,11 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
 /* Program to test PowerPC AltiVec instructions.  */
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 extern void abort (void);
 #define CHECK_IF(E) if(!(E)) abort()
@@ -26,9 +26,6 @@ vector float f, g, h;
 
 int main ()
 {
-
-  altivec_check();  /* Exit if AltiVec not available.  */
-
   k = vec_add (a1, a2);
   CHECK_IF (vec_all_eq (addi, k));
   CHECK_IF (vec_all_ge (addi, k));
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-24.c b/gcc/testsuite/gcc.target/powerpc/altivec-24.c
index cb1a66832e74c3d7d02077ab3f1eaec0198c477e..d296fe2465804665dd1ce4565f805b81c54c89be 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-24.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-24.c
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 extern void abort (void);
 
@@ -28,7 +28,6 @@ int verify (void)
 
 int main (void)
 {
-  altivec_check ();   /* Exit if hardware doesn't support AltiVec.  */
   initialize (MAGIC_NUMBER);
   verify ();
   return 0;
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-3.c b/gcc/testsuite/gcc.target/powerpc/altivec-3.c
index 17f62fd8f03a7a5a86789e253f732ac482dc94c8..d388ad299a4d6a6614dec63c7a9f8c80d6be6e58 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-3.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-3.c
@@ -1,8 +1,10 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
-#include "altivec_check.h"
+extern void exit (int);
+extern void abort (void);
 
 typedef int int4 __attribute__ ((vector_size (16)));
 typedef float float4 __attribute__ ((vector_size (16)));
@@ -73,7 +75,6 @@ main1 ()
 int
 main ()
 {
-  altivec_check ();
   main1 ();
   exit (0);
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-cell-2.c b/gcc/testsuite/gcc.target/powerpc/altivec-cell-2.c
index b9c7c90b30394335955baed9de8da9125a331f3d..fdb375c9efe072eeb1aaa5448afb19dea271be8d 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-cell-2.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-cell-2.c
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 /* Test the vec_extract VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
 
 extern void abort (void);
 
@@ -137,6 +137,5 @@ int main1(void)
 
 int main(void)
 { 
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 ();
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-cell-3.c b/gcc/testsuite/gcc.target/powerpc/altivec-cell-3.c
index abaf56f2770bb4ff011020e89c64c7eef0ad3bc8..b941ab186fa15c01cbe2f60d05dcfd04f50764d7 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-cell-3.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-cell-3.c
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 /* Test the vec_splats and vec_promote VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
     
 extern void abort (void);
         
@@ -33,6 +33,5 @@ int main1(int t)
     
 int main(void)
 { 
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 (0);
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-cell-4.c b/gcc/testsuite/gcc.target/powerpc/altivec-cell-4.c
index b800ea5110519cb6568e5590c1630b7102aafdd0..c694691d475913268b9f752f19c6af56184b8e15 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-cell-4.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-cell-4.c
@@ -1,10 +1,10 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec" } */
 
 /* Test the vec_splats and vec_promote VMX intrinsics.  */
 #include <altivec.h>
-#include "altivec_check.h"
     
 extern void abort (void);
         
@@ -38,6 +38,5 @@ int main1(int t)
   
 int main(void)
 {
-  altivec_check();  /* Exits if AltiVec not supported */
   return main1 (0);
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-cell-8.c b/gcc/testsuite/gcc.target/powerpc/altivec-cell-8.c
index 12e13e00aa857993e9508c3658e1cf4a269231a3..dda5eb0c1142461aea347aedce8872f759470510 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-cell-8.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-cell-8.c
@@ -1,9 +1,11 @@
-/* { dg-do run } */
+/* { dg-do run { target { powerpc*-*-* && cell_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! cell_hw } } } } */
 /* { dg-require-effective-target powerpc_ppu_ok } */
 /* { dg-options "-O2 -maltivec -mabi=altivec -mcpu=cell" } */
 #include <altivec.h>
 #include <string.h>
-#include "altivec_check.h"
+
+extern void abort (void);
 
 typedef short int sint16;
 typedef signed char int8;
@@ -51,6 +53,5 @@ return 0;
 
 int main(void)
 {
-  altivec_cell_check ();
   return main1();
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-consts.c b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c
index e06a5286b175b9ae8b2bfd29719faa60b8e689e9..2c5bc99cff81788f79a9eb2fc25400ed94adfa52 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-consts.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-consts.c
@@ -1,11 +1,10 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec -mabi=altivec -O2" } */
 
 /* Check that "easy" AltiVec constants are correctly synthesized.  */
 
-#include "altivec_check.h"
-
 extern void abort (void);
 
 typedef __attribute__ ((vector_size (16))) unsigned char v16qi;
@@ -283,8 +282,6 @@ void v4si_vspltisw_neg_addself ()
 
 int main ()
 {
-  altivec_check ();   /* Exit if hardware doesn't support AltiVec.  */
-
   v16qi_vspltisb ();
   v16qi_vspltisb_neg ();
   v16qi_vspltisb_addself ();
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c b/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c
index 2aa54a912a583da5fb12cd14a06104df48f1bfd7..1349ae590d9d49b48f1889b4cc19e65c520fbd94 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-varargs-1.c
@@ -1,11 +1,12 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec -mabi=altivec -fno-inline" } */
 
 #include <stdarg.h>
-#include <signal.h>
 
-#include "altivec_check.h"
+extern void exit (int);
+extern void abort (void);
 
 #define vector __attribute__((vector_size (16)))
 
@@ -77,8 +78,5 @@ int main1(void)
 
 int main (void)
 {
-  /* Exit on systems without AltiVec.  */
-  altivec_check ();
-
   return main1 ();
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c b/gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c
index e6027bdeff845a7f26e945bb85fa5e202f92e2a5..3689f97490ce2361a918d8079d6fb2727444e24d 100644
--- a/gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c
@@ -1,9 +1,9 @@
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-maltivec -O2" } */
 
 #include <altivec.h>
-#include "altivec_check.h"
 
 int printf(const char * , ...);
 extern void abort();
@@ -600,7 +600,6 @@ int main(int argc, char **argv)
 {
     char toto[32] __attribute__((aligned(16)));
 
-    altivec_check ();	/* Exit if hardware doesn't support AltiVec.  */
     foo(toto, toto, 0, 0);
     return 0;
 }
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec_check.h b/gcc/testsuite/gcc.target/powerpc/altivec_check.h
deleted file mode 100644
index d966e238a104a701c0e9b338fcf5ff946864d223..0000000000000000000000000000000000000000
--- a/gcc/testsuite/gcc.target/powerpc/altivec_check.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* A runtime check for AltiVec capability.  */
-/* Contributed by Ziemowit Laski  <zlaski@apple.com>  */
-
-#include <signal.h>
-extern void exit (int);
-extern void abort (void);
-
-void 
-sig_ill_handler (int sig)
-{
-    exit (0);
-}
-
-void altivec_check(void) {
-
-  /* Exit on systems without AltiVec.  */
-  signal (SIGILL, sig_ill_handler);
-#ifdef __MACH__
-  asm volatile ("vor v0,v0,v0");
-#else
-  asm volatile ("vor 0,0,0");
-#endif
-  signal (SIGILL, SIG_DFL);
-}
-
-void altivec_cell_check (void)
-{
-#ifdef __PPU__
-  /* Exit on systems without the Cell Altivec instructions.  */
-  signal (SIGILL, sig_ill_handler);
-#ifdef __MACH__
-  asm volatile ("vor v0,v0,v0");
-  asm volatile ("lvlx v0,r0,r0");
-#else
-  asm volatile ("vor 0,0,0");
-  asm volatile ("lvlx 0,0,0");
-#endif
-  signal (SIGILL, SIG_DFL);
-#else
-  /* altivec_cell_check shouldn't be called without -mcpu=cell.  */
-  abort ();
-#endif
-}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr35907.c b/gcc/testsuite/gcc.target/powerpc/pr35907.c
index e1749dea8c90f384e9c4badc26db6b719f2dc0bc..7d5465ea1514b9bce6066b34e12a5479900d67f7 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr35907.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr35907.c
@@ -1,10 +1,9 @@
 /* PR target/35907 */
-/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
+/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
 /* { dg-require-effective-target powerpc_altivec_ok } */
 /* { dg-options "-O2 -maltivec" } */
 
-#include "altivec_check.h"
-
 #define vector __attribute__((vector_size (16)))
 union
 {
@@ -53,7 +52,6 @@ test (void)
 int
 main ()
 {
-  altivec_check ();
   test ();
   return 0;
 }
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 1aa1855a1abe36a025d3858ec1d4cddbc123790d..af806be6dd181dd4a35b798b3b45002f9c87e075 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -905,6 +905,40 @@ proc check_vmx_hw_available { } {
     }]
 }
 
+# Return 1 if the target supports executing AltiVec and Cell PPU
+# instructions, 0 otherwise.  Cache the result.
+
+proc check_effective_target_cell_hw { } {
+    return [check_cached_effective_target cell_hw_available {
+	# Some simulators are known to not support VMX and PPU instructions.
+	if { [istarget powerpc-*-eabi*] } {
+	    expr 0
+	} else {
+	    # Most targets don't require special flags for this test
+	    # case, but Darwin and AIX do.
+	    if { [istarget *-*-darwin*]
+		 || [istarget *-*-aix*] } {
+		set options "-maltivec -mcpu=cell"
+	    } else {
+		set options "-mcpu=cell"
+	    }
+	    check_runtime_nocache cell_hw_available {
+		int main()
+		{
+		#ifdef __MACH__
+		  asm volatile ("vor v0,v0,v0");
+                  asm volatile ("lvlx v0,r0,r0");
+		#else
+		  asm volatile ("vor 0,0,0");
+                  asm volatile ("lvlx 0,0,0");
+	        #endif
+		  return 0;
+		}
+	    } $options
+	}
+    }]
+}
+
 # Return 1 if the target supports executing 64-bit instructions, 0
 # otherwise.  Cache the result.