From: Scott D. <sc...@da...> - 2001-10-25 13:07:09
|
I came across a bizarre behavior that I'm having trouble reconciling. Consider this innocent piece of code: /* pointer to char arithmetic */ void pc_add(void) { if(*cP0) failures++; *cP0 = *cP0 + 1; if(*cP0 != 1) failures++; } All it does is check to see if a the value to which cP0 points is zero or not and then increments that value and checks to see if the increment was successful. This is part of a (yet un-commit'd PIC regression test). When compiled for the PIC port, I noticed that the pointer cPO is referenced in two consecutive iCode assignments. For example, in the dumpraw0 debug log (obtained with --dumpall) I notice: ---------------------------------------------------------------- a.c(14:0:11:0:0) _iffalse_0($2) : a.c(16:0:12:0:0) iTemp5 [k9 lr0:0 so:0]{ ia1 re0 rm0 nos0}{char * generic } = @[_cP0 [k2 lr0:0 so:0]{ ia1 re0 rm0 nos0}{char * generic }] a.c(16:0:13:0:0) iTemp6 [k10 lr0:0 so:0]{ ia1 re0 rm0 nos0}{char} = @[_cP0 [k2 lr0:0 so:0]{ ia1 re0 rm0 nos0}{char * generic }] In other words, _cP0 is copied to iTemp5 AND iTemp6. The only difference is that iTemp5 is a "char * generic" while iTemp6 is a "char". So I thought this was perhaps just some carry over from an 8051 idiosynchracy. But if you look at the mcs51 assembly output you see this: ; a.c 16 mov r2,_cP0 mov r3,(_cP0 + 1) mov r4,(_cP0 + 2) mov dpl,_cP0 mov dph,(_cP0 + 1) mov b,(_cP0 + 2) lcall __gptrget ; Peephole 185 changed order of increment (acc incremented also!) inc a ; Peephole 191 removed redundant mov mov r5,a mov dpl,r2 mov dph,r3 mov b,r4 lcall __gptrput I suppose this code is perfectly correct. But why bother stashing _cP0 into r2,r3, r4, AND dpl, dph, b. Isn't it adequate to simply reload dpl,dph,b with _cP0 for the call to __gptrput? (Incidently, gptrput and gptrget do not affect the contents of dpl and dph; thus the second loading of dpl and dph is not necessary). Scott |