From: Andrew MacLeod Date: Mon, 12 Jul 2021 15:38:17 +0000 (-0400) Subject: Do not register a cast as an equivalence. X-Git-Tag: basepoints/gcc-13~6055 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1539b797a06e03b08e1f1de28ad0d19a3956616;p=thirdparty%2Fgcc.git Do not register a cast as an equivalence. Registering an equivalence between objects of the same size in a cast can cause other relations to be incorrect. gcc/ PR tree-optimization/101335 * range-op.cc (operator_cast::lhs_op1_relation): Delete. gcc/testsuite/ * gcc.dg/tree-ssa/pr101335.c: New. --- diff --git a/gcc/range-op.cc b/gcc/range-op.cc index f8e4c6d4e49f..08000465fd93 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -2159,10 +2159,6 @@ public: const irange &lhs, const irange &op2, relation_kind rel = VREL_NONE) const; - virtual enum tree_code lhs_op1_relation (const irange &lhs, - const irange &op1, - const irange &op2) const; - private: bool truncating_cast_p (const irange &inner, const irange &outer) const; bool inside_domain_p (const wide_int &min, const wide_int &max, @@ -2171,27 +2167,6 @@ private: const irange &outer) const; } op_convert; -// Determine if there is a relationship between LHS and OP1. - -enum tree_code -operator_cast::lhs_op1_relation (const irange &lhs, - const irange &op1, - const irange &op2 ATTRIBUTE_UNUSED) const -{ - if (op1.undefined_p ()) - return VREL_NONE; - // We can't make larger types equivalent to smaller types because we can - // miss sign extensions in a chain of casts. - // u32 = 0xfffff - // s32 = (s32) u32 - // s64 = (s64) s32 - // we cant simply "convert" s64 = (s64)u32 or we get positive 0xffff - // value instead of sign extended negative value. - if (TYPE_PRECISION (lhs.type ()) == TYPE_PRECISION (op1.type ())) - return EQ_EXPR; - return VREL_NONE; -} - // Return TRUE if casting from INNER to OUTER is a truncating cast. inline bool diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c new file mode 100644 index 000000000000..921362c29541 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c @@ -0,0 +1,17 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +unsigned a = 0xFFFFFFFF; +int b; +int main() +{ + int c = ~a; + unsigned d = c - 10; + if (d > c) + c = 20; + b = -(c | 0); + if (b > -8) + __builtin_abort (); + return 0; +} +