This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Defect insice ARM compiler intrinsic memset function

I have found severe defect inside ARM cor Cortex-M3 compiler. It occurs only in release build.

And this is compilation result. Only 8 bytes is cleared, by using STR.

0x00013F06 F88D5008 STRB r5,[sp,#0x08]
23: UINT8 data[9];

64: continue;
65: }
66:
0x00013F42 E00F B 0x00013F64

67: memset(data,0, sizeof(data));
70:
0x00013F44 9504 STR r5,[sp,#0x10]
0x00013F46 9505 STR r5,[sp,#0x14]

71: if(ReadBlockFromSRAM(data, addr, sizeof(data)))
72: {
0x00013F48 2209 MOVS r2,#0x09

=============================================================

When I use:
x2 = sizeof(data);
memset(data,0,x2);

It works fine.

Parents
  • Just for cleaning things up. I am debugging I2C peripheral. And the I2C transfer fails only when transfer size is 9 bytes long together with release build. Debug build is 100% OK.

    My failure is to suspect compiler that it is generating bad code. The most probable solution is that release code is somewhere faster.

    Generally I love failures that manifests only in release builds. They are very hard to find.

Reply
  • Just for cleaning things up. I am debugging I2C peripheral. And the I2C transfer fails only when transfer size is 9 bytes long together with release build. Debug build is 100% OK.

    My failure is to suspect compiler that it is generating bad code. The most probable solution is that release code is somewhere faster.

    Generally I love failures that manifests only in release builds. They are very hard to find.

Children
No data