diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2019-01-21 21:14:40 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2019-01-21 21:14:40 +0100 |
commit | d50114960965a85deb3ba6a19ac4f7640ed97e7e (patch) | |
tree | 672151d6c240a3de840102efe025b2e262e5f9ae | |
parent | 52e6797044fc8e5281d862339f4c27988017557d (diff) | |
download | gcc-d50114960965a85deb3ba6a19ac4f7640ed97e7e.zip gcc-d50114960965a85deb3ba6a19ac4f7640ed97e7e.tar.gz gcc-d50114960965a85deb3ba6a19ac4f7640ed97e7e.tar.bz2 |
re PR target/88938 (ICE in extract_insn, at recog.c:2304)
PR target/88938
* config/i386/i386.c (ix86_expand_builtin) [case IX86_BUILTIN_BEXTRI32,
case IX86_BUILTIN_BEXTRI64]: Sanitize operands.
testsuite/ChangeLog:
PR target/88938
* gcc.target/i386/pr88938.c: New test.
From-SVN: r268123
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88938.c | 5 |
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ca20ae..73c3a66 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-01-21 Uroš Bizjak <ubizjak@gmail.com> + + PR target/88938 + * config/i386/i386.c (ix86_expand_builtin) [case IX86_BUILTIN_BEXTRI32, + case IX86_BUILTIN_BEXTRI64]: Sanitize operands. + 2019-01-21 Michael Ploujnikov <michael.ploujnikov@oracle.com> * hash-map-tests.c (test_map_of_strings_to_int): Show how to use diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 8abff99..88557f2 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -37215,6 +37215,16 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget, unsigned char lsb_index = INTVAL (op1) & 0xFF; op1 = GEN_INT (length); op2 = GEN_INT (lsb_index); + + mode1 = insn_data[icode].operand[1].mode; + if (!insn_data[icode].operand[1].predicate (op0, mode1)) + op0 = copy_to_mode_reg (mode1, op0); + + mode0 = insn_data[icode].operand[0].mode; + if (target == 0 + || !register_operand (target, mode0)) + target = gen_reg_rtx (mode0); + pat = GEN_FCN (icode) (target, op0, op1, op2); if (pat) emit_insn (pat); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba5285f..bb703a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-21 Uroš Bizjak <ubizjak@gmail.com> + + PR target/88938 + * gcc.target/i386/pr88938.c: New test. + 2019-01-21 Jakub Jelinek <jakub@redhat.com> PR sanitizer/88901 diff --git a/gcc/testsuite/gcc.target/i386/pr88938.c b/gcc/testsuite/gcc.target/i386/pr88938.c new file mode 100644 index 0000000..1314ebb --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr88938.c @@ -0,0 +1,5 @@ +/* PR target/88938 */ +/* { dg-do compile } */ +/* { dg-options "-Og -fno-tree-ccp -fno-tree-fre -mtbm" } */ + +#include "tbm-bextri-1.c" |