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:
parent
6940c20bbb
commit
d503cd9871
28
gcc/testsuite/g++.dg/pr96818.C
Normal file
28
gcc/testsuite/g++.dg/pr96818.C
Normal 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 ();
|
||||
}
|
14
gcc/testsuite/gcc.dg/pr96818.c
Normal file
14
gcc/testsuite/gcc.dg/pr96818.c
Normal 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;
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user