https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90049
Bug ID: 90049 Summary: Wrong expanding for a unsigned short ssa_name in embedded assembly code. Product: gcc Version: 6.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: wangtao42 at huawei dot com Target Milestone: --- Created attachment 46143 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46143&action=edit testcase A unsigned short ssa_name in embedded assembly code will be expanded to subreg:HI, and without the bit extracting action. It will result in a wrong assembly code. The attachment is the testcase, and the command is as follows: mips-sde-elf-gcc -O2 -S t2.c And the result assembly code is: func: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 lw $3,0($4) lw $2,%gp_rel(g_b)($28) srl $4,$3,24 sw $3,%gp_rel(g_a)($28) ext $6,$2,0,17 sltu $7,$4,1 #APP # 27 "t2.c" 1 addiu $5, $6, 0 movn $5, $3, $7 # 0 "" 2 #NO_APP ins $2,$5,0,17 .set noreorder .set nomacro jr $31 sw $2,%gp_rel(g_b)($28) It is wrong that the $3 is loaded a word from 0($4), and the $3 should be the low 16bit of 0($4). I guess something wrong with expand_gimple_basic_block, and this ignore should not be used in embedded assembly code: 5822 def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF); 5823 5824 if (def_p != NULL) 5825 { 5826 /* Ignore this stmt if it is in the list of 5827 replaceable expressions. */ 5828 if (SA.values 5829 && bitmap_bit_p (SA.values, 5830 SSA_NAME_VERSION (DEF_FROM_PTR (def_p)))) 5831 continue; 5832 } 5833 last = expand_gimple_stmt (stmt); Please help to check this. Thanks