aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ifcvt.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr103028.c21
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;
+}