On January 19, 2018 10:29:36 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >THis bug has been introduced 16.5 years ago. If >simplify_binary_operation_1 >is called with op1 (MEM) on which avoid_constant_pool_reference returns >something simpler, for UMOD simplification we check that trueop1 is >CONST_INT and power of 2, but then we use INTVAL of the op1 (MEM). > >Fixed by using INTVAL on what we've tested. Additionally, if the value >has msb set and all other bits clear, exact_log2 will return > 0, but >INTVAL (trueop1) - 1 will invoke UB. Bootstrapped/regtested on >x86_64-linux >and i686-linux, ok for trunk?
OK. Richard. >2018-01-19 Jakub Jelinek <ja...@redhat.com> > > PR target/83930 > * simplify-rtx.c (simplify_binary_operation_1) <case UMOD>: Use > UINTVAL (trueop1) instead of INTVAL (op1). > > * gcc.dg/pr83930.c: New test. > >--- gcc/simplify-rtx.c.jj 2018-01-14 17:16:55.657836138 +0100 >+++ gcc/simplify-rtx.c 2018-01-19 10:24:03.389017997 +0100 >@@ -3411,7 +3411,8 @@ simplify_binary_operation_1 (enum rtx_co > if (CONST_INT_P (trueop1) > && exact_log2 (UINTVAL (trueop1)) > 0) > return simplify_gen_binary (AND, mode, op0, >- gen_int_mode (INTVAL (op1) - 1, mode)); >+ gen_int_mode (UINTVAL (trueop1) - 1, >+ mode)); > break; > > case MOD: >--- gcc/testsuite/gcc.dg/pr83930.c.jj 2018-01-19 10:33:16.657831745 >+0100 >+++ gcc/testsuite/gcc.dg/pr83930.c 2018-01-19 10:31:55.383859102 +0100 >@@ -0,0 +1,17 @@ >+/* PR target/83930 */ >+/* { dg-do compile } */ >+/* { dg-options "-Og -fno-tree-ccp -w" } */ >+ >+unsigned __attribute__ ((__vector_size__ (16))) v; >+ >+static inline void >+bar (unsigned char d) >+{ >+ v /= d; >+} >+ >+__attribute__ ((always_inline)) void >+foo (void) >+{ >+ bar (4); >+} > > Jakub