diff options
author | liuhongt <hongtao.liu@intel.com> | 2020-10-21 13:05:16 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2020-10-21 17:33:53 +0800 |
commit | 9b5d50b7c6e34267b40bdeb4c145e9132d83762d (patch) | |
tree | b71f269d5598aaf5ab5029604b1fc52bef151871 /gcc | |
parent | 5244b4af5e47bc98a2a9cf36f048981583a1b163 (diff) | |
download | gcc-9b5d50b7c6e34267b40bdeb4c145e9132d83762d.zip gcc-9b5d50b7c6e34267b40bdeb4c145e9132d83762d.tar.gz gcc-9b5d50b7c6e34267b40bdeb4c145e9132d83762d.tar.bz2 |
Simplify trivial VEC_COND_EXPR in expander.
gcc/ChangeLog:
PR target/97506
* config/i386/i386-expand.c (ix86_expand_sse_movcc): Move
op_true to dest directly when op_true equals op_false.
gcc/testsuite/ChangeLog:
PR target/97506
* gcc.target/i386/pr97506.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386-expand.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr97506.c | 19 |
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index 02d5ca5..d0d7a96 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -3525,6 +3525,13 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) machine_mode mode = GET_MODE (dest); machine_mode cmpmode = GET_MODE (cmp); + /* Simplify trivial VEC_COND_EXPR to avoid ICE in pr97506. */ + if (rtx_equal_p (op_true, op_false)) + { + emit_move_insn (dest, op_true); + return; + } + /* In AVX512F the result of comparison is an integer mask. */ bool maskcmp = mode != cmpmode && ix86_valid_mask_cmp_mode (mode); diff --git a/gcc/testsuite/gcc.target/i386/pr97506.c b/gcc/testsuite/gcc.target/i386/pr97506.c new file mode 100644 index 0000000..74714cf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr97506.c @@ -0,0 +1,19 @@ +/* PR target/97506 */ +/* { dg-do compile } */ +/* { dg-options "-Og -finline-functions-called-once -fno-tree-ccp -mavx512vbmi -mavx512vl" } */ + +typedef unsigned char __attribute__ ((__vector_size__ (16))) U; +typedef int __attribute__ ((__vector_size__ (4))) V; +U u; + +void +bar (int i, V v) +{ + u += (char) i & (char) i > (U){}; +} + +void +foo (void) +{ + bar (0, (V){}); +} |