-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andrew included a patch in this PR to make optimize_bitfield_assignment_op work again. I've fixed a couple indention problems and added a couple comments.
Bootstrapped and regression tested on x86_64-unknown-linux-gnu. Applied to trunk. Interestingly enough, it clearly helps the testcase referenced in the PR, but doesn't help GCC itself or the runtime libraries. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJNg2WxAAoJEBRtltQi2kC7zBUIAKqguCLpaXKfsQ4LnUfBlnvS 7f4ortxtl30UoIIAVhMD1kaVusdCYPAGBPd4nfvj5QWdf3Ka2h+wrNevRZdG9jqQ kmcaDt39khLrzagau3EmgxfG3FhjTfLQME8b+4D07Hj3FuYlxepUuv0wQ9phJZKI Q6Ra33peqlG5q9ywSOoFtDWeOPdhLF/cHt4N6iSPhD4kQEqpo8KyHe3MSON+0WF/ Y1Hu41ASYmNHnjemjUJojbLaVfGkgdJsIBi90TmwNcv1yCEeYpiDQCzdsP5aWpaZ lv9yVWcuTiUux2uzgNhrHJWBOMAcsJ0i8Wlo5IhnHAKVTg6gwa+7+yYd1c/05ao= =9x8U -----END PGP SIGNATURE-----
PR middle-end/47790 * expr.c (optimize_bitfield_assignment_op): Revamp to work again after expansion changes. Index: expr.c =================================================================== *** expr.c (revision 171074) --- expr.c (working copy) *************** optimize_bitfield_assignment_op (unsigne *** 3974,3979 **** --- 3974,3981 ---- tree op0, op1; rtx value, result; optab binop; + gimple srcstmt; + enum tree_code code; if (mode1 != VOIDmode || bitsize >= BITS_PER_WORD *************** optimize_bitfield_assignment_op (unsigne *** 3983,3995 **** return false; STRIP_NOPS (src); ! if (!BINARY_CLASS_P (src) ! || TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE) return false; ! op0 = TREE_OPERAND (src, 0); ! op1 = TREE_OPERAND (src, 1); ! STRIP_NOPS (op0); if (!operand_equal_p (to, op0, 0)) return false; --- 3985,4021 ---- return false; STRIP_NOPS (src); ! if (TREE_CODE (src) != SSA_NAME) ! return false; ! if (TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE) ! return false; ! ! srcstmt = get_gimple_for_ssa_name (src); ! if (!srcstmt ! || TREE_CODE_CLASS (gimple_assign_rhs_code (srcstmt)) != tcc_binary) return false; ! code = gimple_assign_rhs_code (srcstmt); ! ! op0 = gimple_assign_rhs1 (srcstmt); ! ! /* If OP0 is an SSA_NAME, then we want to walk the use-def chain ! to find its initialization. Hopefully the initialization will ! be from a bitfield load. */ ! if (TREE_CODE (op0) == SSA_NAME) ! { ! gimple op0stmt = get_gimple_for_ssa_name (op0); ! ! /* We want to eventually have OP0 be the same as TO, which ! should be a bitfield. */ ! if (!op0stmt ! || !is_gimple_assign (op0stmt) ! || gimple_assign_rhs_code (op0stmt) != TREE_CODE (to)) ! return false; ! op0 = gimple_assign_rhs1 (op0stmt); ! } ! ! op1 = gimple_assign_rhs2 (srcstmt); if (!operand_equal_p (to, op0, 0)) return false; *************** optimize_bitfield_assignment_op (unsigne *** 4026,4032 **** if (BYTES_BIG_ENDIAN) bitpos = str_bitsize - bitpos - bitsize; ! switch (TREE_CODE (src)) { case PLUS_EXPR: case MINUS_EXPR: --- 4052,4058 ---- if (BYTES_BIG_ENDIAN) bitpos = str_bitsize - bitpos - bitsize; ! switch (code) { case PLUS_EXPR: case MINUS_EXPR: *************** optimize_bitfield_assignment_op (unsigne *** 4054,4060 **** set_mem_expr (str_rtx, 0); } ! binop = TREE_CODE (src) == PLUS_EXPR ? add_optab : sub_optab; if (bitsize == 1 && bitpos + bitsize != str_bitsize) { value = expand_and (str_mode, value, const1_rtx, NULL); --- 4080,4086 ---- set_mem_expr (str_rtx, 0); } ! binop = code == PLUS_EXPR ? add_optab : sub_optab; if (bitsize == 1 && bitpos + bitsize != str_bitsize) { value = expand_and (str_mode, value, const1_rtx, NULL); *************** optimize_bitfield_assignment_op (unsigne *** 4087,4093 **** set_mem_expr (str_rtx, 0); } ! binop = TREE_CODE (src) == BIT_IOR_EXPR ? ior_optab : xor_optab; if (bitpos + bitsize != GET_MODE_BITSIZE (GET_MODE (str_rtx))) { rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize) --- 4113,4119 ---- set_mem_expr (str_rtx, 0); } ! binop = code == BIT_IOR_EXPR ? ior_optab : xor_optab; if (bitpos + bitsize != GET_MODE_BITSIZE (GET_MODE (str_rtx))) { rtx mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << bitsize)