2019-05-21 Uroš Bizjak <ubiz...@gmail.com> PR target/90547 * config/i386/i386.md (anddi_1 to andsi_1_zext splitter): Avoid calling gen_lowpart with CONST operand.
testsuite/ChangeLog: 2019-05-21 Uroš Bizjak <ubiz...@gmail.com> PR target/90547 * gcc.target/i386/pr90547.c: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline SVN, patch will be backported to all release branches. Uros.
Index: config/i386/i386.md =================================================================== --- config/i386/i386.md (revision 271467) +++ config/i386/i386.md (working copy) @@ -8525,6 +8525,14 @@ operands[2] = shallow_copy_rtx (operands[2]); PUT_MODE (operands[2], SImode); } + else if (GET_CODE (operands[2]) == CONST) + { + /* (const:DI (plus:DI (symbol_ref:DI ("...")) (const_int N))) */ + operands[2] = copy_rtx (operands[2]); + PUT_MODE (operands[2], SImode); + PUT_MODE (XEXP (operands[2], 0), SImode); + PUT_MODE (XEXP (XEXP (operands[2], 0), 0), SImode); + } else operands[2] = gen_lowpart (SImode, operands[2]); }) Index: testsuite/gcc.target/i386/pr90547.c =================================================================== --- testsuite/gcc.target/i386/pr90547.c (nonexistent) +++ testsuite/gcc.target/i386/pr90547.c (working copy) @@ -0,0 +1,21 @@ +/* PR target/90547 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void +foo () +{ + void *g[] = {&&a, &&b}; + + for (unsigned c = 0x1F;; c >>= 1) + { + unsigned d = (long)("a"+1); + long e = 8; + + while (e) + { + a: goto *g[c&d]; + b: e--; + } + } +}