https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117526

            Bug ID: 117526
           Summary: gcc.dg/tree-ssa/pr108357.c fails without integer
                    argument promotion
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
  Target Milestone: ---

If TARGET_PROMOTE_PROTOTYPES returns false or the C frontend doesn't promote
integer argument as implemented in

https://patchwork.sourceware.org/project/gcc/list/?series=40497

gcc.dg/tree-ssa/pr108357.c fails if char is signed.  The difference starts
at the ccp1 pass:

1.  With signed char:

;; Function main (main, funcdef_no=2, decl_uid=2806, cgraph_uid=3,
symbol_order=
4)

Adding destination of edge (0 -> 2) to worklist

Simulating block 2

Visiting statement:
b.2_1 = b;
which is likely CONSTANT
Lattice value changed to VARYING.  Adding SSA edges to worklist.

Visiting statement:
_2 = (short int) b.2_1;
which is likely CONSTANT
Lattice value changed to VARYING.  Adding SSA edges to worklist.

2. With unsigned char:

;; Function main (main, funcdef_no=2, decl_uid=4429, cgraph_uid=3,
symbol_order=
4)

Adding destination of edge (0 -> 2) to worklist

Simulating block 2

Visiting statement:
b.2_1 = b;
which is likely CONSTANT
Lattice value changed to VARYING.  Adding SSA edges to worklist.

Visiting statement:
_2 = (short int) b.2_1;
which is likely CONSTANT
Lattice value changed to CONSTANT 0x0 (0xff).  Adding SSA edges to worklist.
marking stmt to be not simulated again

It is due to

static ccp_prop_value_t
get_value_for_expr (tree expr, bool for_bits_p)
{
...
  if (val.lattice_val == VARYING
      && INTEGRAL_TYPE_P (TREE_TYPE (expr))
      && TYPE_UNSIGNED (TREE_TYPE (expr)))
    val.mask = wi::zext (val.mask, TYPE_PRECISION (TREE_TYPE (expr)));

  return val;
}

Reply via email to