tree-optimization/114203 - wrong CLZ niter computation
For precision less than int we apply the adjustment to make it defined at zero after the adjustment to make it compute CLZ rather than CTZ. That's wrong. PR tree-optimization/114203 * tree-ssa-loop-niter.cc (build_cltz_expr): Apply CTZ->CLZ adjustment before making the result defined at zero. * gcc.dg/torture/pr114203.c: New testcase.
This commit is contained in:
parent
324d2907c8
commit
cde50296a1
2 changed files with 24 additions and 4 deletions
21
gcc/testsuite/gcc.dg/torture/pr114203.c
Normal file
21
gcc/testsuite/gcc.dg/torture/pr114203.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
/* { dg-do run } */
|
||||
|
||||
int __attribute__((noipa))
|
||||
foo (unsigned char b)
|
||||
{
|
||||
int c = 0;
|
||||
|
||||
while (b) {
|
||||
b >>= 1;
|
||||
c++;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
if (foo(0) != 0)
|
||||
__builtin_abort ();
|
||||
return 0;
|
||||
}
|
|
@ -2288,6 +2288,9 @@ build_cltz_expr (tree src, bool leading, bool define_at_zero)
|
|||
src = fold_convert (unsigned_type_node, src);
|
||||
|
||||
call = build_call_expr (fn, 1, src);
|
||||
if (leading && prec < i_prec)
|
||||
call = fold_build2 (MINUS_EXPR, integer_type_node, call,
|
||||
build_int_cst (integer_type_node, i_prec - prec));
|
||||
if (define_at_zero)
|
||||
{
|
||||
tree is_zero = fold_build2 (NE_EXPR, boolean_type_node, src,
|
||||
|
@ -2295,10 +2298,6 @@ build_cltz_expr (tree src, bool leading, bool define_at_zero)
|
|||
call = fold_build3 (COND_EXPR, integer_type_node, is_zero, call,
|
||||
build_int_cst (integer_type_node, prec));
|
||||
}
|
||||
|
||||
if (leading && prec < i_prec)
|
||||
call = fold_build2 (MINUS_EXPR, integer_type_node, call,
|
||||
build_int_cst (integer_type_node, i_prec - prec));
|
||||
}
|
||||
|
||||
return call;
|
||||
|
|
Loading…
Add table
Reference in a new issue