%a.addr = alloca i32, align 4
store i32 10, i32* %a.addr, align 4
%a = load i32, i32* %a.addr, align 4
%iptr = getelementptr i32, i32* %a, 5
%ret = getelementptr [20 x i32], [20 x i32]* %a, i64 10, i64 12
%l.val.addr = getelementptr %struct list, struct list* %l.addr, i32 0, i32 0
%cmp = icmp eq i32 %a, %b
br i1 %cmp, label %if.then, label %if.end
br label %out
%ret = call i32 @insert(i32 %a, i32 %b) ; direct call
%ret = call i32 %cmp(%a.addr, %b.addr) ; indirect call
%call = call i8* @mymalloc(i32 4)
%3 = bitcast i8* %call to i32*

Is it possible to update the value of ptr without storing in %ptr.addr directly?

Disallow stack aliasing