re PR target/78262 (wrong code with -fschedule-insns)
authorUros Bizjak <uros@gcc.gnu.org>
Wed, 9 Nov 2016 19:21:11 +0000 (20:21 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 9 Nov 2016 19:21:11 +0000 (20:21 +0100)
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

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr78262.c [new file with mode: 0644]

index 28f64ed3e198407d862e32c643dde59b9ea7017f..55c6e6f096efb3e208786d2536c5fd4221d18332 100644 (file)
@@ -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.
        * 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.
index 6e0348de7bc3ff4a7b1124e2eba58ce930137ce5..a5650a1ea14c45d032f6293fb48cee69f88a0fb8 100644 (file)
   "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))]
index 7def8a781cdc863d2387f5a32419b88c0eca8518..bc80499f3d017adb7be43fae75ca73f7c5afb188 100644 (file)
@@ -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 (file)
index 0000000..a0ead41
--- /dev/null
@@ -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;
+}