diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc index 34fae065454..649ad536161 100644 --- a/gcc/ipa-cp.cc +++ b/gcc/ipa-cp.cc @@ -1926,7 +1926,8 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, Value_Range varying (dst_type); varying.set_varying (dst_type); - return (handler.fold_range (dst_vr, dst_type, src_vr, varying) + return (handler.operand_check_p (dst_type, src_type, dst_type) + && handler.fold_range (dst_vr, dst_type, src_vr, varying) && !dst_vr.varying_p () && !dst_vr.undefined_p ()); } diff --git a/gcc/testsuite/gcc.dg/pr111922.c b/gcc/testsuite/gcc.dg/pr111922.c new file mode 100644 index 00000000000..4f429d741c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr111922.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-fre" } */ + +void f2 (void); +void f4 (int, int, int); +struct A { int a; }; +struct B { struct A *b; int c; } v; + +static int +f1 (x, y) + struct C *x; + struct A *y; +{ + (v.c = v.b->a) || (v.c = v.b->a); + f2 (); +} + +static void +f3 (int x, int y) +{ + int b = f1 (0, ~x); + f4 (0, 0, v.c); +} + +void +f5 (void) +{ + f3 (0, 0); +}