diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2016-11-09 20:21:11 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2016-11-09 20:21:11 +0100 |
commit | ff1f317b3c1fdcfb061e20f3474f77c183189830 (patch) | |
tree | 7e72a8c9904b1f800b2e5e0ba01fbe6f65ff43e9 /gcc | |
parent | 302356da473b5032be5f5cacb351982cb7d23ab8 (diff) | |
download | gcc-ff1f317b3c1fdcfb061e20f3474f77c183189830.zip gcc-ff1f317b3c1fdcfb061e20f3474f77c183189830.tar.gz gcc-ff1f317b3c1fdcfb061e20f3474f77c183189830.tar.bz2 |
re PR target/78262 (wrong code with -fschedule-insns)
PR target/78262
* config/i386/i386.md (*<shift_insn><mode>3_doubleword): Mark
operand 0 as earlyclobber.
testsuite/ChangeLog:
PR target/78262
* gcc.target/i386/pr78262.c: New test.
From-SVN: r242013
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr78262.c | 32 |
4 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28f64ed..55c6e6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-09 Uros Bizjak <ubizjak@gmail.com> + + PR target/78262 + * config/i386/i386.md (*<shift_insn><mode>3_doubleword): Mark + operand 0 as earlyclobber. + 2016-11-09 Martin Liska <mliska@suse.cz> * fold-const-call.c (fold_const_call): Fix up type of s0 and s1. @@ -107,7 +113,7 @@ * sanitizer.def (__asan_version_mismatch_check_v6): Replace with __asan_version_mismatch_check_v8. - 2016-11-08 David Edelsohn <dje.gcc@gmail.com> +2016-11-08 David Edelsohn <dje.gcc@gmail.com> * dwarf2asm.c (USE_LINKONCE_INDIRECT): Test XCOFF_DEBUGGING_INFO at runtime. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 6e0348d..a5650a1 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -10339,7 +10339,7 @@ "operands[2] = gen_lowpart (QImode, operands[2]);") (define_insn_and_split "*<shift_insn><mode>3_doubleword" - [(set (match_operand:DWI 0 "register_operand" "=r") + [(set (match_operand:DWI 0 "register_operand" "=&r") (any_shiftrt:DWI (match_operand:DWI 1 "register_operand" "0") (match_operand:QI 2 "nonmemory_operand" "<S>c"))) (clobber (reg:CC FLAGS_REG))] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7def8a7..bc80499 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-09 Uros Bizjak <ubizjak@gmail.com> + + PR target/78262 + * gcc.target/i386/pr78262.c: New test. + 2016-11-09 Fritz O. Reese <fritzoreese@gmail.com> PR fortran/78259 diff --git a/gcc/testsuite/gcc.target/i386/pr78262.c b/gcc/testsuite/gcc.target/i386/pr78262.c new file mode 100644 index 0000000..a0ead417 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr78262.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int128 } */ +/* { dg-options "-O -fschedule-insns" } */ + +typedef unsigned char u8; +typedef unsigned __int128 u128; + +static u128 u128_0; +static u128 *p128; + +u128 __attribute__ ((noinline, noclone)) +foo(u8 u8_0) +{ + p128 = &u128_0; + u128_0 = u8_0; + u128_0 = u128_0 << 127 | u128_0 >> 1; + u128_0 >>= (u8)u128_0; + return 2 + u128_0; +} + +int +main() +{ + u128 x = foo(5); + if (p128 != &u128_0) + __builtin_abort(); + if (u128_0 != ((u128)2 << 124)) + __builtin_abort(); + if (x != ((u128)2 << 124) + 2) + __builtin_abort(); + return 0; +} |