https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79121
Bug ID: 79121
Summary: [6, 7 regression] invalid expansion of sign-extend
unsigned plus left shift
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rearnsha at gcc dot gnu.org
CC: jiwang at gcc dot gnu.org
Target Milestone: ---
Target: arm-* mips-*
In the following, the conversion to long long requires a zero extend, however
the expanders use an arithmetic right shift to generate the high-part word.
long long dohash(unsigned x) {
return ((long long)x) << 4;
}
On ARM this generates
mov r1, r0
lsl r0, r0, #4
asr r1, r1, #28 // Should be lsr
bx lr
Similarly on MIPS:
sll $3,$4,4
.set noreorder
.set nomacro
jr $31
sra $2,$4,28 // should be srl
Possibly introduced by this patch:
r227018
Author: jiwang <jiwang@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed Aug 19 22:55:28 2015 +0000
[Patch][expand] Check gimple statement to improve LSHIFT_EXP expand
This patch improves LSHIFT_EXP expand if the shift operand comes from sign
extension and the shift result across word_mode_size boundary. See code
comments for details.
2015-08-19 Jiong.Wang <[email protected]>
gcc/
* expr.c (expand_expr_real_2): Check gimple statement during
LSHIFT_EXPR expand.