From 88231ff68197c2c22f33e1a8ba251bc0b02b1f2d Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson <hp@axis.com> Date: Tue, 8 May 2012 15:21:50 +0000 Subject: [PATCH] re PR target/53272 (wrong condition-codes for strict-low-part destination and small-integer source) PR target/53272 * gcc.dg/torture/pr53272-1.c, gcc.dg/torture/pr53272-2.c: New test. From-SVN: r187284 --- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr53272-1.c | 39 ++++++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr53272-2.c | 39 ++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr53272-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr53272-2.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca4bcf89c6e4..88e4cc887a0c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-08 Hans-Peter Nilsson <hp@axis.com> + + PR target/53272 + * gcc.dg/torture/pr53272-1.c, gcc.dg/torture/pr53272-2.c: New test. + 2012-05-08 Richard Guenther <rguenther@suse.de> * gcc.dg/fold-bitand-4.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr53272-1.c b/gcc/testsuite/gcc.dg/torture/pr53272-1.c new file mode 100644 index 000000000000..a8fc91cb5b3d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53272-1.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-additional-sources "pr53272-2.c" } */ +struct rtc_class_ops { + int (*f)(void *, unsigned int enabled); +}; + +struct rtc_device +{ + void *owner; + const struct rtc_class_ops *ops; + int ops_lock; +}; + +__attribute__ ((__noinline__, __noclone__)) +extern int foo(void *); +__attribute__ ((__noinline__, __noclone__)) +extern void foobar(void *); + +__attribute__ ((__noinline__, __noclone__)) +int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) +{ + int err; + asm volatile (""); + + err = foo(&rtc->ops_lock); + + if (err) + return err; + + if (!rtc->ops) + err = -19; + else if (!rtc->ops->f) + err = -22; + else + err = rtc->ops->f(rtc->owner, enabled); + + foobar(&rtc->ops_lock); + return err; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr53272-2.c b/gcc/testsuite/gcc.dg/torture/pr53272-2.c new file mode 100644 index 000000000000..f5065a785b74 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53272-2.c @@ -0,0 +1,39 @@ +__attribute__ ((__noinline__, __noclone__)) +int foo(void *x) +{ + asm (""); + return *(int *) x != 42; +} + +__attribute__ ((__noinline__, __noclone__)) +void foobar(void *x) +{ + asm (""); + if (foo(x)) + __builtin_abort(); +} + +struct rtc_class_ops { + int (*f)(void *, unsigned int enabled); +}; + +struct rtc_device +{ + void *owner; + struct rtc_class_ops *ops; + int ops_lock; +}; + +extern __attribute__ ((__noinline__, __noclone__)) +int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int); + +int main(void) +{ + struct rtc_class_ops ops = {(void *) 0}; + struct rtc_device dev1 = {0, &ops, 42}; + + if (rtc_update_irq_enable (&dev1, 1) != -22) + __builtin_abort (); + + __builtin_exit (0); +} -- GitLab