PR tree-optimization/96818 - cast label range to type of switch operand

PR tree-optimization/96818
	* tree-vrp.c (find_case_label_range): Cast label range to
	type of switch operand.
This commit is contained in:
Aldy Hernandez 2020-08-28 18:44:58 +02:00
parent 6940c20bbb
commit d503cd9871
3 changed files with 44 additions and 0 deletions

View File

@ -0,0 +1,28 @@
// { dg-do compile }
// { dg-options "-O2" }
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 ();
}

View File

@ -0,0 +1,14 @@
// { dg-do compile }
// { dg-options "-O2" }
int a, b, c;
void d() {
unsigned short e;
while (b)
;
e = (e + 5) / a;
switch (e)
case 0:
case 3:
c = a;
}

View File

@ -3850,6 +3850,8 @@ find_case_label_range (gswitch *switch_stmt, const irange *range_of_op)
if (!case_high)
case_high = CASE_LOW (max_label);
widest_irange label_range (CASE_LOW (min_label), case_high);
if (!types_compatible_p (label_range.type (), range_of_op->type ()))
range_cast (label_range, range_of_op->type ());
label_range.intersect (range_of_op);
if (label_range.undefined_p ())
return gimple_switch_label (switch_stmt, 0);