diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ifcvt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr103028.c | 21 |
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 017944f..b0052f6 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -4726,7 +4726,9 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge) /* If that results in an invalid insn, back out. */ for (rtx_insn *x = seq; x; x = NEXT_INSN (x)) - if (recog_memoized (x) < 0) + if (reload_completed + ? !valid_insn_p (x) + : recog_memoized (x) < 0) return FALSE; /* Emit the new insns before cond_earliest. */ diff --git a/gcc/testsuite/gcc.dg/pr103028.c b/gcc/testsuite/gcc.dg/pr103028.c new file mode 100644 index 0000000..df96c62 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr103028.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-fif-conversion2 -Og" } */ +/* { dg-options "-fif-conversion2 -Og -march=z9-ec" { target { s390x-*-* } } } */ + +unsigned char x; +int foo(void) +{ + unsigned long long i = x; + i = i + 0x80000000; + unsigned long long t = 0xffffffff; + + if (i > t) { + unsigned long long ii; + asm("":"=g"(ii):"0"(i)); + if ((ii <= t)) + __builtin_trap(); + return x; + } + + return 0; +} |