https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88739
--- Comment #23 from John Dong <dongjianqiang2 at huawei dot com> --- diff -urp a/gcc/expr.c b/gcc/expr.c --- a/gcc/expr.c 2019-01-09 03:19:03.750205982 +0800 +++ b/gcc/expr.c 2019-01-09 03:38:23.414174738 +0800 @@ -10760,6 +10760,16 @@ expand_expr_real_1 (tree exp, rtx target && GET_MODE_CLASS (ext_mode) == MODE_INT) reversep = TYPE_REVERSE_STORAGE_ORDER (type); + int modePrecision = GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (tem))); + int typePrecision = TYPE_PRECISION (TREE_TYPE (tem)); + int shiftSize = modePrecision - typePrecision; + rtx regTarget = gen_reg_rtx (GET_MODE (op0)); + + if (shiftSize && REG_P (op0)) + op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0, + shiftSize, regTarget, + TYPE_UNSIGNED (TREE_TYPE (tem))); + op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp, (modifier == EXPAND_STACK_PARM ? NULL_RTX : target), Tried to fix the bug when expand.