aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2016-11-09 20:21:11 +0100
committerUros Bizjak <uros@gcc.gnu.org>2016-11-09 20:21:11 +0100
commitff1f317b3c1fdcfb061e20f3474f77c183189830 (patch)
tree7e72a8c9904b1f800b2e5e0ba01fbe6f65ff43e9 /gcc
parent302356da473b5032be5f5cacb351982cb7d23ab8 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/config/i386/i386.md2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr78262.c32
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;
+}