[Bug tree-optimization/106163] New: generic-match does not honor -fnon-call-exceptions -fno-delete-dead-exceptions

ian at airs dot com gcc-bugzilla@gcc.gnu.org
Fri Jul 1 22:32:41 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106163

            Bug ID: 106163
           Summary: generic-match does not honor -fnon-call-exceptions
                    -fno-delete-dead-exceptions
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ian at airs dot com
  Target Milestone: ---

When using -fnon-call-exceptions -fno-delete-dead-exceptions memory operations
that are not marked TREE_THIS_NOTRAP should not be removed from the execution
path.  However, the generic_simplify function, at least, does not honor this.

This test case, when compiled with -fnon-call-exceptions
-fno-delete-dead-exceptions, should exit with a zero status.  However, it
currently fails, because "i = *p ^ *p;" is simplified to "i = 0;".

// { dg-do run { target { i?86-*-linux* i?86-*-gnu* x86_64-*-linux* } } }
// { dg-additional-options "-fexceptions -fnon-call-exceptions
-fno-delete-dead-exceptions" }

#include <signal.h>
#include <stdlib.h>
#include <string.h>

static void
sighandler (int signo, siginfo_t* si, void* uc)
{
  throw (5);
}

struct S { void *p1, *p2; };

struct S v;

__attribute__ ((noinline))
int
dosegv ()
{
  int *p = 0;
  int i __attribute__((unused)) = 0;
  i = *p ^ *p;
  return 0;
}

int main ()
{
  struct sigaction sa;

  memset (&sa, 0, sizeof sa);
  sa.sa_sigaction = sighandler;
  sigaction (SIGSEGV, &sa, NULL);
  sigaction (SIGBUS, &sa, NULL);

  try {
    dosegv ();
  }
  catch (int x) {
    return (x != 5);
  }

  return 1;
}


More information about the Gcc-bugs mailing list