https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87511
Bug ID: 87511 Summary: [9 Regression][AArch64] UBFIZ instruction with invalid immediate emitted Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: sudi at gcc dot gnu.org Target Milestone: --- When compiling the code below with aarch64 and -Os int a, d; struct { signed f5 : 26; signed f6 : 12; } b; signed char c; void fn1() { signed char *e = &c; d = a * 10; *e = d; b.f6 = c; b.f5 = 8 <= 3; } We get: $ aarch64-none-elf-gcc -march=armv8-a -c test.c -o /dev/null -Os -Wall /tmp/ccVimNZB.s: Assembler messages: /tmp/ccVimNZB.s:20: Error: immediate value out of range 1 to 32 at operand 4 -- `ubfiz x0,x0,32,38' This started somewhere between r260322 and r261702. Seems to be incorrectly matching the below in IRA //(insn:TI 30 22 35 (set (reg:DI 0 x0 [120]) // (and:DI (ashift:DI (reg:DI 0 x0 [orig:92 _3 ] [92]) // (const_int 32 [0x20])) // (const_int 17587958185983 [0xfff03ffffff]))) "bfiz.c":12 786 \{*andim_ashiftdi_bfiz} // (nil)) ubfiz x0, x0, 32, 38 // 30 [c=4 l=4] *andim_ashiftdi_bfiz