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

Aldy Hernandez <aldyh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |aldyh at gcc dot gnu.org
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|2018-10-30 00:00:00         |2020-08-27

--- Comment #1 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
This seems to be the same problem we're seeing in PR96818, which interestingly
is C++, so this affects more than just Ada:

bool operatorY ();

struct l
{
  int m;
  int k;
  void n ();
    l ()
  {
    while (operatorY ())
      switch ((unsigned char) k)
        case 0:
        {
          n ();
          case 1:if (m)
            ;
        }
  }
};

void
p ()
{
  l ();
}

In simplify_stmt_for_jump_threading we see:

(gdb) p debug(switch_stmt)
switch (_6) <default: <L7> [33.33%], case 0: <L3> [33.33%], case 1: <L6>
[33.33%]>

;; Type of switch operand _6 is "int":
(gdb) p debug_generic_stmt(switch_stmt->op[0].typed.type)
int

;; gimple_switch_label(switch_stmt, 1):
(gdb) p debug_generic_stmt(switch_stmt->op[2])
case 0:;

;; Type of CASE_LOW of case 0 is unsigned char:
(gdb) p debug_generic_stmt(switch_stmt->op[2].exp.operands[0].typed.type)
unsigned char

I won't go into the details of the other PR, but suffice to say that it's
caused by switch operands being a different type than the case low/high values.

Reply via email to