On Mon, 10 Jul 2023 at 16:43, Xi Ruoyao via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On Mon, 2023-07-10 at 10:33 +0000, Richard Biener wrote: > > On Fri, 7 Jul 2023, Xi Ruoyao wrote: > > > > > If a bit-field is signed and it's wider than the output type, we > > > must > > > ensure the extracted result sign-extended. But this was not handled > > > correctly. > > > > > > For example: > > > > > > int x : 8; > > > long y : 55; > > > bool z : 1; > > > > > > The vectorized extraction of y was: > > > > > > vect__ifc__49.29_110 = > > > MEM <vector(2) long unsigned int> [(struct Item > > > *)vectp_a.27_108]; > > > vect_patt_38.30_112 = > > > vect__ifc__49.29_110 & { 9223372036854775552, > > > 9223372036854775552 }; > > > vect_patt_39.31_113 = vect_patt_38.30_112 >> 8; > > > vect_patt_40.32_114 = > > > VIEW_CONVERT_EXPR<vector(2) long int>(vect_patt_39.31_113); > > > > > > This is obviously incorrect. This pach has implemented it as: > > > > > > vect__ifc__25.16_62 = > > > MEM <vector(2) long unsigned int> [(struct Item > > > *)vectp_a.14_60]; > > > vect_patt_31.17_63 = > > > VIEW_CONVERT_EXPR<vector(2) long int>(vect__ifc__25.16_62); > > > vect_patt_32.18_64 = vect_patt_31.17_63 << 1; > > > vect_patt_33.19_65 = vect_patt_32.18_64 >> 9; > > > > OK. > > Pushed r14-2407 and r13-7553. Hi Xi, Your commit: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=63ae6bc60c0f67fb2791991bf4b6e7e0a907d420,
seems to cause following regressions on arm-linux-gnueabihf: FAIL: g++.dg/vect/pr110557.cc -std=c++98 (test for excess errors) FAIL: g++.dg/vect/pr110557.cc -std=c++14 (test for excess errors) FAIL: g++.dg/vect/pr110557.cc -std=c++17 (test for excess errors) FAIL: g++.dg/vect/pr110557.cc -std=c++20 (test for excess errors) Excess error: gcc/testsuite/g++.dg/vect/pr110557.cc:12:8: warning: width of 'Item::y' exceeds its type Thanks, Prathamesh > > -- > Xi Ruoyao <xry...@xry111.site> > School of Aerospace Science and Technology, Xidian University