> Am 09.12.2023 um 10:35 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> Hi!
> 
> This function is never called when param_l1_cache_line_size is 0,
> but it uses int and unsigned int variables to hold alignment in
> bits, so for large param_l1_cache_line_size it is zero and e.g.
> DECL_ALIGN () % param_align_bits can divide by zero.
> Looking at the code, the function uses tree_fits_uhwi_p on the trees
> before converting them using tree_to_uhwi to int variables, which
> looks just wrong, either it would need to punt if it doesn't fit
> into those and also check for overflows during the computation,
> or use unsigned HOST_WIDE_INT for all of this.  That also fixes
> the division by zero, as param_l1_cache_line_size maximum is INT_MAX,
> that multiplied by 8 will always fit.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok

> 2023-12-09  Jakub Jelinek  <ja...@redhat.com>
> 
>    PR tree-optimization/112887
>    * tree-ssa-phiopt.cc (hoist_adjacent_loads): Change type of
>    param_align, param_align_bits, offset1, offset2, size2 and align1
>    variables from int or unsigned int to unsigned HOST_WIDE_INT.
> 
>    * gcc.dg/pr112887.c: New test.
> 
> --- gcc/tree-ssa-phiopt.cc.jj    2023-11-14 10:52:16.195275972 +0100
> +++ gcc/tree-ssa-phiopt.cc    2023-12-08 16:25:29.166747347 +0100
> @@ -3757,8 +3757,8 @@ static void
> hoist_adjacent_loads (basic_block bb0, basic_block bb1,
>              basic_block bb2, basic_block bb3)
> {
> -  int param_align = param_l1_cache_line_size;
> -  unsigned param_align_bits = (unsigned) (param_align * BITS_PER_UNIT);
> +  unsigned HOST_WIDE_INT param_align = param_l1_cache_line_size;
> +  unsigned HOST_WIDE_INT param_align_bits = param_align * BITS_PER_UNIT;
>   gphi_iterator gsi;
> 
>   /* Walk the phis in bb3 looking for an opportunity.  We are looking
> @@ -3770,8 +3770,7 @@ hoist_adjacent_loads (basic_block bb0, b
>       gimple *def1, *def2;
>       tree arg1, arg2, ref1, ref2, field1, field2;
>       tree tree_offset1, tree_offset2, tree_size2, next;
> -      int offset1, offset2, size2;
> -      unsigned align1;
> +      unsigned HOST_WIDE_INT offset1, offset2, size2, align1;
>       gimple_stmt_iterator gsi2;
>       basic_block bb_for_def1, bb_for_def2;
> 
> --- gcc/testsuite/gcc.dg/pr112887.c.jj    2023-12-08 16:31:30.708697160 +0100
> +++ gcc/testsuite/gcc.dg/pr112887.c    2023-12-08 16:27:06.662385487 +0100
> @@ -0,0 +1,13 @@
> +/* PR tree-optimization/112887 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 --param=l1-cache-line-size=0x20000000" } */
> +
> +void bar (long);
> +long c;
> +struct S { long a, b; } s;
> +
> +void
> +foo (void)
> +{
> +  bar (c ? s.a : s.b);
> +}
> 
>    Jakub
> 

Reply via email to