From: Uros Bizjak Date: Fri, 29 Jan 2016 18:25:13 +0000 (+0100) Subject: re PR target/69459 (wrong code with -O2 and vector arithmetics @ x86_64) X-Git-Tag: releases/gcc-4.9.4~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e312553b255b981477f99f3b2e01ced7f2faef4;p=thirdparty%2Fgcc.git re PR target/69459 (wrong code with -O2 and vector arithmetics @ x86_64) PR target/69459 * config/i386/constraints.md (C): Only accept constant zero operand. (BC): New constraint. * config/i386/sse.md (*mov_internal): Use BC constraint instead of C constraint. * doc/md.texi (Machine Constraints): Update description of C constraint. testsuite/ChangeLog: PR target/69459 * gcc.target/i386/pr69459.c: New test. From-SVN: r232992 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d2d25108052a..feda63843e35 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-01-29 Uros Bizjak + + PR target/69459 + * config/i386/constraints.md (C): Only accept constant zero operand. + (BC): New constraint. + * config/i386/sse.md (*mov_internal): Use BC constraint + instead of C constraint. + * doc/md.texi (Machine Constraints): Update description + of C constraint. + 2016-01-26 Tom de Vries PR tree-optimization/69110 @@ -133,7 +143,7 @@ 2015-12-25 Andreas Tobler Backport from mainline - 2015-12-25 Andreas Tobler + 2015-12-25 Andreas Tobler * config/rs6000/freebsd64.h: Delete FREEBSD_DYNAMIC_LINKER32/64 defines. Use FBSD_DYNAMIC_LINKER instead. @@ -368,8 +378,8 @@ * tree-sra.c (replace_removed_params_ssa_names): Do not distinguish between types of statements but accept original definitions as a parameter. - (ipa_sra_modify_function_body): Use FOR_EACH_SSA_DEF_OPERAND to - iterate over definitions. + (ipa_sra_modify_function_body): Use FOR_EACH_SSA_DEF_OPERAND to + iterate over definitions. 2015-10-27 Caroline Tice @@ -755,7 +765,7 @@ 2015-07-01 Ramana Radhakrishnan Backport from mainline - 2015-06-24 Ramana Radhakrishnan + 2015-06-24 Ramana Radhakrishnan PR target/63408 * config/arm/arm.c (vfp3_const_double_for_fract_bits): Disable @@ -819,8 +829,8 @@ Backport from mainline r212178. 2014-06-30 Joseph Myers - * var-tracking.c (add_stores): Return instead of asserting if old - and new values for conditional store are the same. + * var-tracking.c (add_stores): Return instead of asserting if old + and new values for conditional store are the same. 2015-06-23 Ludovic Courtès diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md index 567e705646a9..b662f8747d69 100644 --- a/gcc/config/i386/constraints.md +++ b/gcc/config/i386/constraints.md @@ -18,7 +18,7 @@ ;; . ;;; Unused letters: -;;; B H +;;; H ;;; h j ;; Integer register constraints. @@ -156,6 +156,10 @@ (and (not (match_test "TARGET_X32")) (match_operand 0 "memory_operand"))) +(define_constraint "BC" + "@internal SSE constant operand." + (match_test "standard_sse_constant_p (op)")) + ;; Integer constant constraints. (define_constraint "I" "Integer constant in the range 0 @dots{} 31, for 32-bit shifts." @@ -206,8 +210,8 @@ ;; This can theoretically be any mode's CONST0_RTX. (define_constraint "C" - "Standard SSE floating point constant." - (match_test "standard_sse_constant_p (op)")) + "SSE constant zero operand." + (match_test "standard_sse_constant_p (op) == 1")) ;; Constant-or-symbol-reference constraints. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 3e35268fc9c8..d665accebc0d 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -655,7 +655,7 @@ (define_insn "*mov_internal" [(set (match_operand:VMOVE 0 "nonimmediate_operand" "=v,v ,m") - (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand" "C ,vm,v"))] + (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand" "BC,vm,v"))] "TARGET_SSE && (register_operand (operands[0], mode) || register_operand (operands[1], mode))" diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 7b3e362ba607..e7f4b8bcfb46 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -2444,7 +2444,7 @@ Integer constant in the range 0 @dots{} 127, for 128-bit shifts. Standard 80387 floating point constant. @item C -Standard SSE floating point constant. +SSE constant zero operand. @item e 32-bit signed integer constant, or a symbolic reference known diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 924d3fbffca4..17b6cb820fce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-29 Uros Bizjak + + PR target/69459 + * gcc.target/i386/pr69459.c: New test. + 2016-01-27 Bill Schmidt * gcc.dg/and-1.c: Remove nand test for powerpc*-*-*. diff --git a/gcc/testsuite/gcc.target/i386/pr69459.c b/gcc/testsuite/gcc.target/i386/pr69459.c new file mode 100644 index 000000000000..2d0bbbcdbf1f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr69459.c @@ -0,0 +1,42 @@ +/* PR target/69549 */ +/* { dg-do run { target sse2_runtime } } */ +/* { dg-options "-O2 -msse2" } */ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; +typedef unsigned char v16u8 __attribute__ ((vector_size (16))); +typedef unsigned short v16u16 __attribute__ ((vector_size (16))); +typedef unsigned int v16u32 __attribute__ ((vector_size (16))); +typedef unsigned long long v16u64 __attribute__ ((vector_size (16))); + +u64 __attribute__((noinline, noclone)) +foo (u8 u8_0, u16 u16_3, v16u8 v16u8_0, v16u16 v16u16_0, v16u32 v16u32_0, v16u64 v16u64_0, v16u8 v16u8_1, v16u16 v16u16_1, v16u32 v16u32_1, v16u64 v16u64_1, v16u8 v16u8_2, v16u16 v16u16_2, v16u32 v16u32_2, v16u64 v16u64_2, v16u8 v16u8_3, v16u16 v16u16_3, v16u32 v16u32_3, v16u64 v16u64_3) +{ + v16u64_0 /= (v16u64){u16_3, ((0))} | 1; + v16u64_1 += (v16u64)~v16u32_0; + v16u16_1 /= (v16u16){-v16u64_3[1]} | 1; + v16u64_3[1] -= 0x1fffffff; + v16u32_2 /= (v16u32)-v16u64_0 | 1; + v16u32_1 += ~v16u32_1; + v16u16_3 %= (v16u16){0xfff, v16u32_2[3], v16u8_0[14]} | 1; + v16u64_3 -= (v16u64)v16u32_2; + if (v16u64_1[1] >= 1) { + v16u64_0 %= (v16u64){v16u32_0[1]} | 1; + v16u32_1[1] %= 0x5fb856; + v16u64_1 |= -v16u64_0; + } + v16u8_0 *= (v16u8)v16u32_1; + return u8_0 + v16u8_0 [12] + v16u8_0 [13] + v16u8_0 [14] + v16u8_0 [15] + v16u16_0 [0] + v16u16_0 [1] + v16u32_0 [0] + v16u32_0 [1] + v16u32_0 [2] + v16u32_0 [3] + v16u64_0 [0] + v16u64_0 [1] + v16u8_1 [9] + v16u8_1 [10] + v16u8_1 [11] + v16u8_1 [15] + v16u16_1 [0] + v16u16_1 [1] + v16u16_1 [3] + v16u64_1 [0] + v16u64_1 [1] + v16u8_2 [3] + v16u8_2 [4] + v16u8_2 [5] + v16u8_2 [0] + v16u32_2 [1] + v16u32_2 [2] + v16u32_2 [3] + v16u64_2 [0] + v16u64_2 [1] + v16u8_3 [0] + v16u16_3 [6] + v16u16_3[7] + v16u32_3[1] + v16u32_3[2] + v16u64_3[0] + v16u64_3[1]; +} + +int +main () +{ + u64 x = foo(1, 1, (v16u8){1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, (v16u16){1, 1}, (v16u32){1}, (v16u64){1}, (v16u8){1}, (v16u16){1, 1}, (v16u32){1}, (v16u64){1}, (v16u8){1, 1, 1, 1, 1}, (v16u16){1}, (v16u32){1}, (v16u64){1}, (v16u8){1}, (v16u16){1}, (v16u32){1}, (v16u64){1}); + + if (x != 0xffffffffe0000209) + __builtin_abort(); + return 0; +}