value-relation: Fix up relation_union [PR108447]
Checks
Commit Message
Hi!
While looking at the PR, I've noticed one row in rr_union_table
is wrong. relation_union should be commutative, but due to that
bug is not. The following patch adds a self-test for that
property (fails without the first hunk) and fixes that line.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
The actual floating point relation problem isn't fixed by this patch
though.
2023-01-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/108447
* value-relation.cc (rr_union_table): Fix VREL_UNDEFINED row order.
(relation_tests): Add self-tests for relation_{intersect,union}
commutativity.
* selftest.h (relation_tests): Declare.
* function-tests.cc (test_ranges): Call it.
Jakub
Comments
On 1/19/23 15:16, Jakub Jelinek wrote:
> Hi!
>
> While looking at the PR, I've noticed one row in rr_union_table
> is wrong. relation_union should be commutative, but due to that
> bug is not. The following patch adds a self-test for that
> property (fails without the first hunk) and fixes that line.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> The actual floating point relation problem isn't fixed by this patch
> though.
>
> 2023-01-19 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/108447
> * value-relation.cc (rr_union_table): Fix VREL_UNDEFINED row order.
> (relation_tests): Add self-tests for relation_{intersect,union}
> commutativity.
> * selftest.h (relation_tests): Declare.
> * function-tests.cc (test_ranges): Call it.
> <...>
> +relation_tests ()
> +{
> + // Verify commutativity of relation_intersect and relation_union.
> + for (relation_kind r1 = VREL_VARYING; r1 < VREL_PE8;
> + r1 = relation_kind (r1 + 1))
> + for (relation_kind r2 = VREL_VARYING; r2 < VREL_PE8;
> + r2 = relation_kind (r2 + 1))
> + {
> + ASSERT_EQ (relation_intersect (r1, r2), relation_intersect (r2, r1));
> + ASSERT_EQ (relation_union (r1, r2), relation_union (r2, r1));
> + }
> +}
Easy test, I like it.
@@ -115,7 +115,7 @@ relation_kind rr_union_table[VREL_LAST][
{ VREL_VARYING, VREL_VARYING, VREL_VARYING, VREL_VARYING, VREL_VARYING,
VREL_VARYING, VREL_VARYING, VREL_VARYING },
// VREL_UNDEFINED
- { VREL_VARYING, VREL_LT, VREL_LE, VREL_GT, VREL_GE, VREL_UNDEFINED,
+ { VREL_VARYING, VREL_UNDEFINED, VREL_LT, VREL_LE, VREL_GT, VREL_GE,
VREL_EQ, VREL_NE },
// VREL_LT
{ VREL_VARYING, VREL_LT, VREL_LT, VREL_LE, VREL_NE, VREL_VARYING, VREL_LE,
@@ -1718,3 +1718,26 @@ equiv_relation_iterator::get_name (relat
}
return NULL_TREE;
}
+
+#if CHECKING_P
+#include "selftest.h"
+
+namespace selftest
+{
+void
+relation_tests ()
+{
+ // Verify commutativity of relation_intersect and relation_union.
+ for (relation_kind r1 = VREL_VARYING; r1 < VREL_PE8;
+ r1 = relation_kind (r1 + 1))
+ for (relation_kind r2 = VREL_VARYING; r2 < VREL_PE8;
+ r2 = relation_kind (r2 + 1))
+ {
+ ASSERT_EQ (relation_intersect (r1, r2), relation_intersect (r2, r1));
+ ASSERT_EQ (relation_union (r1, r2), relation_union (r2, r1));
+ }
+}
+
+} // namespace selftest
+
+#endif // CHECKING_P
@@ -244,6 +244,7 @@ extern void predict_cc_tests ();
extern void pretty_print_cc_tests ();
extern void range_tests ();
extern void range_op_tests ();
+extern void relation_tests ();
extern void gimple_range_tests ();
extern void read_rtl_function_cc_tests ();
extern void rtl_tests_cc_tests ();
@@ -583,6 +583,7 @@ test_ranges ()
push_cfun (fun);
range_tests ();
range_op_tests ();
+ relation_tests ();
build_cfg (fndecl);
convert_to_ssa (fndecl);