Likewise, handle (X<<C3) and X as legitimate variants of X*C. */
(for op (bit_ior bit_xor)
(simplify
- (op (mult:s@0 @1 INTEGER_CST@2)
- (mult:s@3 @1 INTEGER_CST@4))
- (if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type)
- && (tree_nonzero_bits (@0) & tree_nonzero_bits (@3)) == 0)
- (mult @1
- { wide_int_to_tree (type, wi::to_wide (@2) + wi::to_wide (@4)); })))
+ (op (nop_convert?:s@6 (mult:s@0 (nop_convert? @1) INTEGER_CST@2))
+ (nop_convert?:s@7 (mult:s@3 (nop_convert? @5) INTEGER_CST@4)))
+ (if (INTEGRAL_TYPE_P (type)
+ && operand_equal_p (@1, @5, 0)
+ && (tree_nonzero_bits (@6) & tree_nonzero_bits (@7)) == 0)
+ (with { tree t = type;
+ if (!TYPE_OVERFLOW_WRAPS (t))
+ t = unsigned_type_for (t);
+ wide_int c = wi::add (wi::to_wide (@2), wi::to_wide (@4)); }
+ (convert (mult:t (convert:t @1) { wide_int_to_tree (t, c); })))))
(simplify
- (op:c (mult:s@0 @1 INTEGER_CST@2)
+ (op:c (nop_convert?:s@5 (mult:s@0 (nop_convert? @1) INTEGER_CST@2))
(lshift:s@3 @1 INTEGER_CST@4))
- (if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type)
+ (if (INTEGRAL_TYPE_P (type)
&& tree_int_cst_sgn (@4) > 0
- && (tree_nonzero_bits (@0) & tree_nonzero_bits (@3)) == 0)
- (with { wide_int wone = wi::one (TYPE_PRECISION (type));
+ && (tree_nonzero_bits (@5) & tree_nonzero_bits (@3)) == 0)
+ (with { tree t = type;
+ if (!TYPE_OVERFLOW_WRAPS (t))
+ t = unsigned_type_for (t);
+ wide_int wone = wi::one (TYPE_PRECISION (type));
wide_int c = wi::add (wi::to_wide (@2),
wi::lshift (wone, wi::to_wide (@4))); }
- (mult @1 { wide_int_to_tree (type, c); }))))
+ (convert (mult:t (convert:t @1) { wide_int_to_tree (t, c); })))))
(simplify
- (op:c (mult:s@0 @1 INTEGER_CST@2)
+ (op:c (nop_convert?:s@3 (mult:s@0 (nop_convert? @1) INTEGER_CST@2))
@1)
- (if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type)
- && (tree_nonzero_bits (@0) & tree_nonzero_bits (@1)) == 0)
- (mult @1
- { wide_int_to_tree (type,
- wi::add (wi::to_wide (@2), 1)); })))
+ (if (INTEGRAL_TYPE_P (type)
+ && (tree_nonzero_bits (@3) & tree_nonzero_bits (@1)) == 0)
+ (with { tree t = type;
+ if (!TYPE_OVERFLOW_WRAPS (t))
+ t = unsigned_type_for (t);
+ wide_int c = wi::add (wi::to_wide (@2), 1); }
+ (convert (mult:t (convert:t @1) { wide_int_to_tree (t, c); })))))
(simplify
(op (lshift:s@0 @1 INTEGER_CST@2)
(lshift:s@3 @1 INTEGER_CST@4))