From 100ed614f49dc076ce55c695398a0aa41bbd9b75 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Mon, 5 Dec 2011 16:11:35 +0000 Subject: [PATCH] re PR target/51408 (Miscompilation in arm.md:*minmax_arithsi) gcc/ PR target/51408 * config/arm/arm.md (*minmax_arithsi): Always require the else clause in the MINUS case. gcc/testsuite/ PR target/51408 * gcc.dg/pr51408.c: New. From-SVN: r182014 --- gcc/ChangeLog | 6 ++++++ gcc/config/arm/arm.md | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr51408.c | 22 ++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr51408.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34d55bb0cae..9e3bce6cc2e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-12-05 Kazu Hirata + + PR target/51408 + * config/arm/arm.md (*minmax_arithsi): Always require the else + clause in the MINUS case. + 2011-12-05 Richard Guenther PR tree-optimization/50904 diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 8ec9b2288bb..6493a791a4a 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -3413,7 +3413,7 @@ bool need_else; if (which_alternative != 0 || operands[3] != const0_rtx - || (code != PLUS && code != MINUS && code != IOR && code != XOR)) + || (code != PLUS && code != IOR && code != XOR)) need_else = true; else need_else = false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dcc8226acdd..c8556570130 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-05 Kazu Hirata + + PR target/51408 + * gcc.dg/pr51408.c: New. + 2011-12-05 Jason Merrill * g++.dg/cpp0x/dc6.C: New. diff --git a/gcc/testsuite/gcc.dg/pr51408.c b/gcc/testsuite/gcc.dg/pr51408.c new file mode 100644 index 00000000000..2cc5cf967b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr51408.c @@ -0,0 +1,22 @@ +/* This testcase used to fail because of a bug in + arm.md:*minmax_arithsi. */ + +/* { dg-do run } */ +/* { dg-options "-O1" } */ + +extern void abort (void); + +int __attribute__((noinline)) +foo (int a, int b) +{ + int max = (b > 0) ? b : 0; + return max - a; +} + +int +main (void) +{ + if (foo (3, -1) != -3) + abort (); + return 0; +} -- 2.30.2