On Fri, 2023-07-07 at 08:15 +0200, Richard Biener wrote: /* snip */
> > + bool sign_ext = (!TYPE_UNSIGNED (TREE_TYPE (bf_ref)) && > > + TYPE_PRECISION (ret_type) > mask_width); > > + bool widening = ((TYPE_PRECISION (TREE_TYPE (container)) < > > + TYPE_PRECISION (ret_type)) > > + && !useless_type_conversion_p (TREE_TYPE (container), > > + ret_type)); > > the !useless_type_conversion_p check isn't necessary, when TYPE_PRECISION > isn't equal the conversion is never useless. I'll drop it. > I'll also note that ret_type == TREE_TYPE (bf_ref). No, ret_type == TREE_TYPE (ret), not TREE_TYPE (bf_ref). For something like struct Item { int x : 30; int y : 30; }; Item *p = get(); unsigned long t = p->y; Then TREE_TYPE (ret) is unsigned long, and TREE_TYPE (bf_ref) is int. In this case we still need to perform the sign extension: if p->y is -1 we should have -1ul in t. So we need to check the signedness of TREE_TYPE (bf_ref). > Can you rename 'widening' to 'load_widen' and 'sign_ext' to 'ref_sext'? As > they > are named it suggest they apply to the same so I originally thought sign_ext > should be widening && !TYPE_UNSIGNED. I'll rename them. I'll send a v2 after testing it. > -- Xi Ruoyao <xry...@xry111.site> School of Aerospace Science and Technology, Xidian University