I have found the following optimization problem in C51 v7.06a: the access to a structure member with offset>0 (XDATA) causes the unnecessary DPTR reload (and computing). There was no such problem in C51 v6.x. Has anyone a solution/idea? Code example C-Source: // XDATA access optimization test #pragma SRC(LST\OptTSt1.asm) #pragma OT(7,SPEED) // -------------------------------------------------------------------------- struct ts { unsigned char cnt1; unsigned char cnt2; }; typedef struct ts xdata TS; // -------------------------------------------------------------------------- void f1(TS* s) { if (++(s->cnt1)==0) s->cnt1=0xFF; // optimization Ok, no DPTR re-load } // -------------------------------------------------------------------------- void f2(TS* s) { if (++(s->cnt2)==0) s->cnt2=0xFF; // the unnecessary DPTR re-load! } Compiler output: … ; void f1(TS* s) RSEG ?PR?_f1?OPTTST1 _f1: ; SOURCE LINE # 12 ;---- Variable 's?040' assigned to Register 'DPTR' ---- MOV DPL,R7 MOV DPH,R6 ; { ; SOURCE LINE # 13 ; if (s->cnt1==0) ; SOURCE LINE # 14 MOVX A,@DPTR JNZ ?C0002 ; s->cnt1=0xFF; // optimization Ok, no DPTR re-load ; SOURCE LINE # 15 MOV A,#0FFH MOVX @DPTR,A ; } ; SOURCE LINE # 16 ?C0002: RET ; END OF _f1 ; // -------------------------------------------------------------------------- ; void f2(TS* s) RSEG ?PR?_f2?OPTTST1 _f2: ; SOURCE LINE # 18 ;---- Variable 's?141' assigned to Register 'R6/R7' ---- ; { ; SOURCE LINE # 19 ; if (s->cnt2==0) ; SOURCE LINE # 20 MOV DPL,R7 MOV DPH,R6 INC DPTR MOVX A,@DPTR JNZ ?C0004 ; s->cnt2=0xFF; // the unnecessary DPTR re-load! ; SOURCE LINE # 21 MOV DPL,R7 MOV DPH,R6 INC DPTR MOV A,#0FFH MOVX @DPTR,A ; } ; SOURCE LINE # 22 ?C0004: RET ; END OF _f2 …