Do not ICE when computing value range of ternary expression
Commit Message
Hi,
In evaluate_conditions_for_known_args we use range_fold_unary_expr and
range_fold_binary_expr to produce value ranges of the expression.
However the expression also may contain ternary COND_EXPR on which we
ICE. I did not find interface to do similar folding easily on ternary
exprs and since it is so rare case, i guess we can just punt and give up
on producing it.
Bootstrapped/regtsted x86_64-linux, OK?
gcc/ChangeLog:
2021-12-12 Jan Hubicka <hubicka@ucw.cz>
* ipa-fnsummary.c (evaluate_conditions_for_known_args): Do not ICE
on ternary expression.
gcc/testsuite/ChangeLog:
2021-12-12 Jan Hubicka <hubicka@ucw.cz>
* gcc.c-torture/compile/pr103513.c: New test.
Comments
On December 12, 2021 9:35:00 PM GMT+01:00, Jan Hubicka via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
>Hi,
>In evaluate_conditions_for_known_args we use range_fold_unary_expr and
>range_fold_binary_expr to produce value ranges of the expression.
>However the expression also may contain ternary COND_EXPR on which we
>ICE. I did not find interface to do similar folding easily on ternary
>exprs and since it is so rare case, i guess we can just punt and give up
>on producing it.
>
>Bootstrapped/regtsted x86_64-linux, OK?
Ok.
Richard.
>gcc/ChangeLog:
>
>2021-12-12 Jan Hubicka <hubicka@ucw.cz>
>
> * ipa-fnsummary.c (evaluate_conditions_for_known_args): Do not ICE
> on ternary expression.
>
>gcc/testsuite/ChangeLog:
>
>2021-12-12 Jan Hubicka <hubicka@ucw.cz>
>
> * gcc.c-torture/compile/pr103513.c: New test.
>
>diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c
>index 6c1cdf17e47..cb3c198ec0c 100644
>--- a/gcc/ipa-fnsummary.c
>+++ b/gcc/ipa-fnsummary.c
>@@ -513,7 +513,7 @@ evaluate_conditions_for_known_args (struct cgraph_node *node,
> op->index ? &vr : &op0);
> }
> else
>- gcc_unreachable ();
>+ res.set_varying (op->type);
> type = op->type;
> vr = res;
> }
>diff --git a/gcc/testsuite/gcc.c-torture/compile/pr103513.c b/gcc/testsuite/gcc.c-torture/compile/pr103513.c
>new file mode 100644
>index 00000000000..ca876a9816c
>--- /dev/null
>+++ b/gcc/testsuite/gcc.c-torture/compile/pr103513.c
>@@ -0,0 +1,8 @@
>+int a;
>+void b(int c) {
>+ int d = 3;
>+ d ^= c < 2;
>+ if (d < 3 && a)
>+ while (1)
>+ b(!a);
>+}
@@ -513,7 +513,7 @@ evaluate_conditions_for_known_args (struct cgraph_node *node,
op->index ? &vr : &op0);
}
else
- gcc_unreachable ();
+ res.set_varying (op->type);
type = op->type;
vr = res;
}
new file mode 100644
@@ -0,0 +1,8 @@
+int a;
+void b(int c) {
+ int d = 3;
+ d ^= c < 2;
+ if (d < 3 && a)
+ while (1)
+ b(!a);
+}