From: Uros Bizjak Date: Fri, 21 Dec 2018 18:11:04 +0000 (+0100) Subject: backport: re PR target/88418 (ICE in extract_insn, at recog.c:2305 (error: unrecogniz... X-Git-Tag: releases/gcc-7.5.0~710 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06a9272de1033eda7530ec0bfe6cc259015b968d;p=thirdparty%2Fgcc.git backport: re PR target/88418 (ICE in extract_insn, at recog.c:2305 (error: unrecognizable insn)) Backport from mainline 2018-12-10 Uros Bizjak PR target/88418 * config/i386/i386.c (ix86_expand_sse_cmp): For vector modes, check operand 1 with vector_operand predicate. (ix86_expand_sse_movcc): For vector modes, check op_true with vector_operand, not nonimmediate_operand. testsuite/ChangeLog: Backport from mainline 2018-12-10 Uros Bizjak PR target/88418 * gcc.target/i386/pr88418.c: New test. From-SVN: r267332 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 56b1d8f82944..a8112a3866b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,11 +1,11 @@ 2018-12-19 Bill Schmidt - Backport from mainline - 2018-12-18 Bill Schmidt + Backport from mainline + 2018-12-18 Bill Schmidt - * doc/extend.texi (PowerPC Altivec/VSX Built-in Functions): - Describe when a typedef name can be used as the type specifier for - a vector type, and when it cannot. + * doc/extend.texi (PowerPC Altivec/VSX Built-in Functions): + Describe when a typedef name can be used as the type specifier for + a vector type, and when it cannot. 2018-12-19 Segher Boessenkool @@ -89,13 +89,13 @@ * gcc/dwarf2out.c (FUNC_SECOND_SECT_LABEL): New. (dwarf2out_switch_text_section): Generate a local label for the second function sub-section and apply it as the second FDE start label. - * gcc/final.c (final_scan_insn_1): Emit second FDE label after the second - sub-section start. + * gcc/final.c (final_scan_insn_1): Emit second FDE label after the + second sub-section start. 2018-11-26 Iain Sandoe 2018-08-15 Iain Sandoe - + * config/darwin.c (darwin_function_switched_text_sections): Delete. * gcc/config/darwin.h diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e74f37f1ca07..637ac5fa98ec 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -24118,7 +24118,7 @@ ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0, return true; } -/* Expand an sse vector comparison. Return the register with the result. */ +/* Expand an SSE comparison. Return the register with the result. */ static rtx ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, @@ -24144,9 +24144,12 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, else cmp_mode = cmp_ops_mode; - cmp_op0 = force_reg (cmp_ops_mode, cmp_op0); - if (!nonimmediate_operand (cmp_op1, cmp_ops_mode)) + + int (*op1_predicate)(rtx, machine_mode) + = VECTOR_MODE_P (cmp_ops_mode) ? vector_operand : nonimmediate_operand; + + if (!op1_predicate (cmp_op1, cmp_ops_mode)) cmp_op1 = force_reg (cmp_ops_mode, cmp_op1); if (optimize @@ -24266,7 +24269,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) rtx (*gen) (rtx, rtx, rtx, rtx) = NULL; rtx d = dest; - if (!nonimmediate_operand (op_true, mode)) + if (!vector_operand (op_true, mode)) op_true = force_reg (mode, op_true); op_false = force_reg (mode, op_false); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8344276af915..b8d74c51a7e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-12-21 Uros Bizjak + + Backport from mainline + 2018-12-10 Uros Bizjak + + PR target/88418 + * gcc.target/i386/pr88418.c: New test. + 2018-12-17 Senthil Kumar Selvaraj Backport from trunk diff --git a/gcc/testsuite/gcc.target/i386/pr88418.c b/gcc/testsuite/gcc.target/i386/pr88418.c new file mode 100644 index 000000000000..3c044430c252 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88418.c @@ -0,0 +1,15 @@ +/* PR target/88418 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fpack-struct -msse4.1 -mno-avx" } */ + +typedef long long v2di __attribute__ ((__vector_size__ (16))); + +union df { + v2di se[2]; +}; + +void +qg (union df *jz, union df *pl) +{ + jz->se[0] = jz->se[0] == pl->se[0]; +}