* sparse-llvm the result of expression add assign when target is a pointer should be a pointer
@ 2017-03-05 7:29 Dibyendu Majumdar
2017-03-05 10:53 ` Luc Van Oostenryck
0 siblings, 1 reply; 2+ messages in thread
From: Dibyendu Majumdar @ 2017-03-05 7:29 UTC (permalink / raw)
To: Linux-Sparse
Hi,
I am starting a new thread on this issue. When processing following
simple example:
char *incr(char *p) {
char *tmp = p;
tmp += 5;
return tmp;
}
The linearizer is taking the type of the expression 'tmp += 5' from
the src operand which is unsigned long, instead of taking the type
from the target operand which is char pointer. This results in
following sequence:
incr:
.L000001CB177AD5C8:
<entry-point>
ptrcast.64 %r3 <- (64) %arg1
add.64 %r4 <- %r3, $5
cast.64 %r5 <- (64) %r4
ret.64 %r5
However if we make the change shown below then this output is produced
which is correct I believe as in add or sub operations, if either left
or right operand is a pointer and the other operand is an int then the
result should be a pointer.
incr:
.L000001633F0BEE58:
<entry-point>
ptrcast.64 %r3 <- (64) %arg1
add.64 %r4 <- %r3, $5
ptrcast.64 %r5 <- (64) %r4
ret.64 %r5
The change required is in linearize_assignment() function. The
suggested version is shown below.
static pseudo_t linearize_assignment(struct entrypoint *ep, struct
expression *expr)
{
...
int opcode;
struct symbol *ctype = src->ctype;
if (!src)
return VOID_PSEUDO;
oldvalue = cast_pseudo(ep, oldvalue, src->ctype, expr->ctype);
opcode = opcode_sign(op_trans[expr->op - SPECIAL_BASE], src->ctype);
if (opcode == OP_ADD || opcode == OP_SUB) {
if (is_ptr_type(target->ctype)) {
ctype = target->ctype;
}
dst = add_binary_op(ep, ctype, opcode, oldvalue, value);
value = cast_pseudo(ep, dst, expr->ctype, ctype);
...
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: sparse-llvm the result of expression add assign when target is a pointer should be a pointer
2017-03-05 7:29 sparse-llvm the result of expression add assign when target is a pointer should be a pointer Dibyendu Majumdar
@ 2017-03-05 10:53 ` Luc Van Oostenryck
0 siblings, 0 replies; 2+ messages in thread
From: Luc Van Oostenryck @ 2017-03-05 10:53 UTC (permalink / raw)
To: Dibyendu Majumdar; +Cc: Linux-Sparse
On Sun, Mar 05, 2017 at 07:29:33AM +0000, Dibyendu Majumdar wrote:
> Hi,
>
> I am starting a new thread on this issue. When processing following
> simple example:
>
> char *incr(char *p) {
> char *tmp = p;
> tmp += 5;
> return tmp;
> }
There is indeed a problem with this example.
> This results in following sequence:
>
> incr:
> .L000001CB177AD5C8:
> <entry-point>
> ptrcast.64 %r3 <- (64) %arg1
> add.64 %r4 <- %r3, $5
> cast.64 %r5 <- (64) %r4
> ret.64 %r5
You must first upgrade to a recent version of sparse as
you seem to not have some fundamental patches here (especially
the patch https://patchwork.kernel.org/patch/9516077/ I've
already talked about it to you). The master branch should be good
the one named 'sparse-next' would be even better.
The linearized code should be:
incr:
.L0:
<entry-point>
cast.64 %r3 <- (64) %arg1
add.64 %r4 <- %r3, $5
ptrcast.64 %r5 <- (64) %r4
ret.64 %r5
Notice the difference in the casts.
-- Luc Van Oostenryck
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-03-05 10:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-05 7:29 sparse-llvm the result of expression add assign when target is a pointer should be a pointer Dibyendu Majumdar
2017-03-05 10:53 ` Luc Van Oostenryck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).