diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-12-09 20:35:18 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-12-09 20:35:18 +0100 |
commit | 424c77c26ed0aca25622745ca14b14eeb7d0895c (patch) | |
tree | 3122adc716bcf35b6905fff72e68949231255209 /gcc | |
parent | bb0f9c0249ee6a1b53e6ae8bdd9d3543991c7291 (diff) | |
download | gcc-424c77c26ed0aca25622745ca14b14eeb7d0895c.zip gcc-424c77c26ed0aca25622745ca14b14eeb7d0895c.tar.gz gcc-424c77c26ed0aca25622745ca14b14eeb7d0895c.tar.bz2 |
re PR target/72742 (ICE in extract_insn, at recog.c:2309 (error: unrecognizable insn) w/ -Os -mlra)
PR target/72742
* config/rs6000/rs6000.md (*and<mode>3_imm_mask_dot,
*and<mode>3_imm_mask_dot2): Add rs6000_is_valid_and_mask to insn
condition.
* gcc.c-torture/compile/pr72742.c: New test.
From-SVN: r243500
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr72742.c | 79 |
4 files changed, 95 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 269f785..b36a14c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-12-09 Jakub Jelinek <jakub@redhat.com> + + PR target/72742 + * config/rs6000/rs6000.md (*and<mode>3_imm_mask_dot, + *and<mode>3_imm_mask_dot2): Add rs6000_is_valid_and_mask to insn + condition. + 2016-12-09 Segher Boessenkool <segher@kernel.crashing.org> PR target/78683 diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 777b996..e466002 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -3256,7 +3256,8 @@ (const_int 0))) (clobber (match_scratch:GPR 0 "=r,r"))] "(<MODE>mode == Pmode || UINTVAL (operands[2]) <= 0x7fffffff) - && rs6000_gen_cell_microcode" + && rs6000_gen_cell_microcode + && rs6000_is_valid_and_mask (operands[2], <MODE>mode)" "@ andi%e2. %0,%1,%u2 #" @@ -3281,7 +3282,8 @@ (and:GPR (match_dup 1) (match_dup 2)))] "(<MODE>mode == Pmode || UINTVAL (operands[2]) <= 0x7fffffff) - && rs6000_gen_cell_microcode" + && rs6000_gen_cell_microcode + && rs6000_is_valid_and_mask (operands[2], <MODE>mode)" "@ andi%e2. %0,%1,%u2 #" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2326b4e..ac7abfd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-09 Jakub Jelinek <jakub@redhat.com> + + PR target/72742 + * gcc.c-torture/compile/pr72742.c: New test. + 2016-12-09 Martin Sebor <msebor@redhat.com> on arm-unknown-linux-gnueabi (and likely other ILP32) targets. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr72742.c b/gcc/testsuite/gcc.c-torture/compile/pr72742.c new file mode 100644 index 0000000..eedcd66 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr72742.c @@ -0,0 +1,79 @@ +/* PR target/72742 */ + +int a, b; +unsigned short int c; + +void +foo (int x, unsigned short int *y) +{ + int fx; + lab: + { + unsigned short int va; + if (x != 0) + { + c %= a < 0; + while (c < 17) + ++c; + b &= fx; + if ((a & (b != 0 ? *y : 0)) != 0) + { + va /= 3; + a += (va != 0) ? (va = a) : 0; + } + a = va && a; + goto lab; + y = &va; + } + } +} + +void +bar (int x, unsigned short int *y) +{ + int fx; + lab: + { + unsigned short int va; + if (x != 0) + { + c %= a < 0; + while (c < 17) + ++c; + b &= fx; + if ((a & (b != 0 ? *y : 24)) != 0) + { + va /= 3; + a += (va != 0) ? (va = a) : 0; + } + a = va && a; + goto lab; + y = &va; + } + } +} + +void +baz (int x, unsigned short int *y) +{ + int fx; + lab: + { + unsigned short int va; + if (x != 0) + { + c %= a < 0; + while (c < 17) + ++c; + b &= fx; + if ((a & (b != 0 ? *y : 25)) != 0) + { + va /= 3; + a += (va != 0) ? (va = a) : 0; + } + a = va && a; + goto lab; + y = &va; + } + } +} |