For a binary op, both sides need to be converted to the resulting type of the usual conversion. For a compound-assignment (which is equivalent to a binary op followed by an assignment), the LHS can't be so converted since its type needs to preserved for the assignment, so only the RHS is converted at evaluation and the type of the RHS is used at linearization to convert the LHS. However, in the case of pointer arithmetics, a number of shortcuts are taken and as a result additions with mixed sizes can be produced producing invalid IR. So, fix this by converting the RHS to the same size as pointers, as done for 'normal' binops. Note: On 32-bit kernel, this patch also removes a few warnings about non size-preserving casts. It's fine as these warnings were designed for when an address would be stored in an integer, not for storing an offset like it's the case here. Reported-by: Valentin Schneider <valentin.schneider@xxxxxxx> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- evaluate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evaluate.c b/evaluate.c index 63a9390b5ee7..1839e35d039f 100644 --- a/evaluate.c +++ b/evaluate.c @@ -619,7 +619,7 @@ static struct symbol *evaluate_ptr_add(struct expression *expr, struct symbol *i ctype = &ptr_ctype; expr->ctype = ctype; - if (multiply == 1 && itype->bit_size >= bits_in_pointer) + if (multiply == 1 && itype->bit_size == bits_in_pointer) return ctype; if (index->type == EXPR_VALUE) { @@ -639,7 +639,7 @@ static struct symbol *evaluate_ptr_add(struct expression *expr, struct symbol *i return ctype; } - if (itype->bit_size < bits_in_pointer) + if (itype->bit_size != bits_in_pointer) index = cast_to(index, ssize_t_ctype); if (multiply > 1) { -- 2.28.0