1  /* { dg-options "-fnon-call-exceptions" } */
       2  /* With -fnon-call-exceptions 0 / 0 should not be eliminated.  */
       3  /* { dg-additional-options "-DSIGNAL_SUPPRESS" { target { ! signal } } } */
       4  /* { dg-additional-options "-mcheck-zero-division" { target { loongarch*-*-* } } } */
       5  
       6  #ifdef SIGNAL_SUPPRESS
       7  # define DO_TEST 0
       8  #elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (__POWERPC__) || defined (__ppc)
       9    /* On PPC division by zero does not trap.  */
      10  # define DO_TEST 0
      11  #elif defined (__riscv)
      12    /* On RISC-V division by zero does not trap.  */
      13  # define DO_TEST 0
      14  #elif defined (__sh__)
      15    /* On SH division by zero does not trap.  */
      16  # define DO_TEST 0
      17  #elif defined (__v850__)
      18    /* On V850 division by zero does not trap.  */
      19  # define DO_TEST 0
      20  #elif defined (__MSP430__)
      21    /* On MSP430 division by zero does not trap.  */
      22  # define DO_TEST 0
      23  #elif defined (__RL78__)
      24    /* On RL78 division by zero does not trap.  */
      25  # define DO_TEST 0
      26  #elif defined (__RX__)
      27    /* On RX division by zero does not trap.  */
      28  # define DO_TEST 0
      29  #elif defined (__aarch64__)
      30    /* On AArch64 integer division by zero does not trap.  */
      31  # define DO_TEST 0
      32  #elif defined (__TMS320C6X__)
      33    /* On TI C6X division by zero does not trap.  */
      34  # define DO_TEST 0
      35  #elif defined (__VISIUM__)
      36    /* On Visium division by zero does not trap.  */
      37  # define DO_TEST 0
      38  #elif defined (__mips__) && !defined(__linux__)
      39    /* MIPS divisions do trap by default, but libgloss targets do not
      40       intercept the trap and raise a SIGFPE.  The same is probably
      41       true of other bare-metal environments, so restrict the test to
      42       systems that use the Linux kernel.  */
      43  # define DO_TEST 0
      44  #elif defined (__mips16) && defined(__linux__)
      45    /* Not all Linux kernels deal correctly the breakpoints generated by
      46       MIPS16 divisions by zero.  They show up as a SIGTRAP instead.  */
      47  # define DO_TEST 0
      48  #elif defined (__MICROBLAZE__)
      49  /* We cannot rely on division by zero generating a trap. */
      50  # define DO_TEST 0
      51  #elif defined (__epiphany__)
      52    /* Epiphany does not have hardware division, and the software implementation
      53       has truly undefined behavior for division by 0.  */
      54  # define DO_TEST 0
      55  #elif defined (__m68k__) && !defined(__linux__)
      56    /* Attempting to trap division-by-zero in this way isn't likely to work on 
      57       bare-metal m68k systems.  */
      58  # define DO_TEST 0
      59  #elif defined (__CRIS__)
      60    /* No SIGFPE for CRIS integer division.  */
      61  # define DO_TEST 0
      62  #elif defined (__MMIX__)
      63  /* By default we emit a sequence with DIVU, which "never signals an
      64     exceptional condition, even when dividing by zero".  */
      65  # define DO_TEST 0
      66  #elif defined (__arc__)
      67    /* No SIGFPE for ARC integer division.  */
      68  # define DO_TEST 0
      69  #elif defined (__arm__) && defined (__ARM_EABI__)
      70  # ifdef __ARM_ARCH_EXT_IDIV__
      71    /* Hardware division instructions may not trap, and handle trapping
      72       differently anyway.  Skip the test if we have those instructions.  */
      73  #  define DO_TEST 0
      74  # else
      75  #  include <signal.h>
      76    /* ARM division-by-zero behavior is to call a helper function, which
      77       can do several different things, depending on requirements.  Emulate
      78       the behavior of other targets here by raising SIGFPE.  */
      79  int __attribute__((used))
      80  __aeabi_idiv0 (int return_value)
      81  {
      82    raise (SIGFPE);
      83    return return_value;
      84  }
      85  #  define DO_TEST 1
      86  # endif
      87  #elif defined (__nios2__)
      88    /* Nios II requires both hardware support and user configuration to
      89       raise an exception on divide by zero.  */
      90  # define DO_TEST 0
      91  #elif defined (__nvptx__)
      92  /* There isn't even a signal function.  */
      93  # define DO_TEST 0
      94  #elif defined (__csky__)
      95    /* This presently doesn't raise SIGFPE even on csky-linux-gnu, much
      96       less bare metal.  See the implementation of __divsi3 in libgcc.  */
      97  # define DO_TEST 0
      98  #elif defined (__moxie__)
      99    /* Not all moxie configurations may raise exceptions.  */
     100  # define DO_TEST 0
     101  #elif defined (__or1k__)
     102    /* On OpenRISC division by zero does not trap.  */
     103  # define DO_TEST 0
     104  #elif defined (__pru__)
     105  /* There isn't even a signal function.  */
     106  # define DO_TEST 0
     107  #else
     108  # define DO_TEST 1
     109  #endif
     110  
     111  extern void abort (void);
     112  extern void exit (int);
     113  
     114  #if DO_TEST
     115  
     116  #include <signal.h>
     117  
     118  void
     119  sigfpe (int signum __attribute__ ((unused)))
     120  {
     121    exit (0);
     122  }
     123  
     124  #endif
     125  
     126  /* When optimizing, the compiler is smart enough to constant fold the
     127     static unset variables i and j to produce 0 / 0, but it can't
     128     eliminate the assignment to the global k.  */
     129  static int i;
     130  static int j;
     131  int k __attribute__ ((used));
     132  
     133  int
     134  main ()
     135  {
     136  #if DO_TEST
     137    signal (SIGFPE, sigfpe);
     138    k = i / j;
     139    abort ();
     140  #else
     141    exit (0);
     142  #endif
     143  }