===================================================================
@@ -202,3 +202,19 @@
(unsigned) significand_size (TYPE_MODE (inter_type))
>= inside_prec - !inside_unsignedp)
(convert @0))))))
+
+/* From tree-ssa-forwprop.c:simplify_conversion_from_bitmask. */
+
+/* If we have a narrowing conversion to an integral
+ type that is fed by a BIT_AND_EXPR, we might be
+ able to remove the BIT_AND_EXPR if it merely
+ masks off bits outside the final type (and nothing
+ else. */
+(simplify
+ (convert (bit_and @0 INTEGER_CST@1))
+ (if (INTEGRAL_TYPE_P (type)
+ && INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (@0))
+ && operand_equal_p (@1, build_low_bits_mask (TREE_TYPE (@1),
+ TYPE_PRECISION (type)), 0))
+ (convert @0)))
===================================================================
@@ -137,8 +137,8 @@ along with GCC; see the file COPYING3.
(pointer_plus @0 (convert?@2 (minus@3 (convert @1) (convert @0))))
/* Conditionally look through a sign-changing conversion. */
(if (TYPE_PRECISION (TREE_TYPE (@2)) == TYPE_PRECISION (TREE_TYPE (@3))
- && ((GIMPLE && useless_type_conversion_p (type, TREE_TYPE (@1))
- || (GENERIC && type == TREE_TYPE (@1)))))
+ && ((GIMPLE && useless_type_conversion_p (type, TREE_TYPE (@1)))
+ || (GENERIC && type == TREE_TYPE (@1))))
@1))
/* From tree-ssa-forwprop.c:associate_pointerplus_align. */