Description of TI Compiler-Optimizer Problem:
Tools Used:
Code Generation Tools: v3.2.2
Code Composer Studio: 3.1.0
DSP-BIOS: cuda-4.90.02.10
DSP: C5509A
Important data structures for the problem description:
/**
information about a block processing channel */
typedef union {
struct {
UInt16 BlockProc :1;
UInt16 BufToProc :1;
UInt16 RESERVED :9;
UInt16 Channel :5;
} B;
UInt16 I;
}
BlockInfoType;
/**
Conference2 connect processing types.
* Contains the queue head for one
conference channel.
* @warning queObj has to be initialized
at startup by QUE_new()!
*/
typedef struct {
QUE_Obj queObj;
QUE_Elem queHead;
ConfAttrType ConfAttr[ CstConf2MaxParty ];
struct {
LinBufferPtrType Odd [
CstConf2MaxParty ];
LinBufferPtrType Even[ CstConf2MaxParty ];
} pOut;
struct {
LinBufferPtrType Odd [
CstConf2MaxParty ];
LinBufferPtrType
Even[ CstConf2MaxParty ];
} pIn;
BlockInfoType BlockInfo[ CstConf2MaxParty ];
UInt16 partyCount;
UInt16 align;
}
ProcConference2InfoType;
/**
* Conference2 queue object for one conference party of a conference channel.
* The object contains all the required information for one party.
*/
typedef struct {
QUE_Elem qelem;
ConfAttrType ConfAttr;
DescriptorType Out;
DescriptorType In;
LinBufferDualPtrType
pOut;
LinBufferDualPtrType
pIn;
BlockInfoType BlockInfo;
}
ProcConference2PartyType;
#define
CstConfBlockProcChanMask 0x8000
#define
CstConfBlockBufToProcMask 0x4000
#define
CstConfBlockChannelMask 0x001F
#define
CstConfBlockAnyToProcMask 0xC000
extern ProcConference2InfoType VarDfcpConference2Info[];
Build Options:
["Compiler" Settings: "Debug"]
Options=-g -k -ss -al -as -o3 -fr"$(Proj_dir)\obj"
-d"_DEBUG" -d"CHIP_5509A" -d"_C55x" -d"USE_ALGRF" -ml -vcore:2.2 -atn --purecirc
C-Code snippet:
GLOBAL void FctConfProcParty(
void )
{
UInt16 i;
UInt16 confChannel;
Uns
intMask = 0;
UInt16 partyToProc = 0;
UInt16 numPartyToProc = 0;
UInt16 blockChannel = 0;
// get channel from channel
bitfield
confChannel = GetChannelFromSwiMailbox(
TRUE );
// valid conference?
if (
confChannel < CstMaxConference2 )
{
ProcConference2InfoType*
pDfcpConf2Info = &( VarDfcpConference2Info[ confChannel ] );
// for all conference
parties ...
for ( i = 0; i <
pDfcpConf2Info->partyCount; i++ )
{
// any
blocks to process?
if (
pDfcpConf2Info->BlockInfo[ i ].I &
CstConfBlockAnyToProcMask == CstConfBlockAnyToProcMask )
{
// get
party number to process
partyToProc = i;
// update
number of parties to process
numPartyToProc++;
}
}
// any party to process?
if (
numPartyToProc > 0 )
{
Int16 *pPartyBuf = NULL,
*pConfBuf = NULL;
// disable interrupts to avoid
access from HWI
intMask = HWI_disable();
// get last
block processing channel
blockChannel =
pDfcpConf2Info->BlockInfo[ partyToProc ].B.Channel;
// get
sample buffers (blocks)
FctConfBlockGetBufToProc(
blockChannel, &pPartyBuf, &pConfBuf );
// restore
interrupt mask
HWI_restore( intMask
);
// echo
canceller enabled?
if (
pDfcpConf2Info->ConfAttr[ partyToProc ].I &
CstConfEchoCancEnaMask > 0 )
{
FctConfBlockLecProc( blockChannel, pPartyBuf, pConfBuf );
}
// add
other block processings here
// blocks
processed (clear processing bit)
pDfcpConf2Info->BlockInfo[
partyToProc ].I &= ~CstConfBlockBufToProcMask;
}
else
{
// send
error message
FctDfcpSetReply(
( CstDfcpReplyConfEvent | ( confChannel << 4 ) |
CstNbrOfWord1 ), ConfEventNoBufferToProc, 0 );
}
}
}
Code compiled with no optimization: no error
--> corresponding C code
0004c5: _FctConfProcParty:
0004c5: 4ef3 AADD #-13,SP
0004c7: e60400 MOV #0,@#02h --> intMask = 0;
0004ca: e60600 MOV #0,@#03h --> partyToProc = 0;
0004cd: e60800 MOV #0,@#04h --> numPartyToProc = 0;
0004d0: e60a00 MOV #0,@#05h --> blockChannel = 0;
0004d3: 6c000000_3d14 CALL _FctConfGetHandles || MOV #1,T0
0004d9: c402 MOV T0,@#01h
0004db: 2249 MOV T0,AR1
0004dd: 6d1900d3 BCC L34,AR1 != #0
0004e1: 76005258 MOV #82,T1
0004e5: 7a00000a MOV #0 << #16,AC0
0004e9: d3021d MPYMU @#01h,T1,AC1
0004ec: 7e000000 OR #0,AC0,AC0
0004f0: 2410 ADD AC1,AC0
0004f2: eb0c08 MOV AC0,dbl(@#06h)
0004f5: e60000 MOV #0,@#00h
0004f8: ed0cbf MOV dbl(@#06h),XAR3
0004fb: aa00 MOV @#00h,AR2
0004fd: a96d004f MOV *AR3(#004fh),AR1
000501: 12a894 CMPU AR2 >= AR1, TC1
000504: 04642e BCC DW$L$_FctConfProcParty$5$E,TC1
000507: L29:
000507: DW$L$_FctConfProcParty$3$B:
000507: ed0cbf MOV dbl(@#06h),XAR3
00050a: df0005 MOV uns(@#00h),AC0
00050d: 90b1 MOV XAR3,AC1
00050f: 2410 ADD AC1,AC0
000511: 900b MOV AC0,XAR3
000513: dc6d000048 BTST #0,*AR3(#0048h),TC1
000518: 6474 BCC DW$L$_FctConfProcParty$4$E,!TC1
00051a: DW$L$_FctConfProcParty$3$E:
00051a: DW$L$_FctConfProcParty$4$B:
00051a: 22a9 MOV AR2,AR1
00051c: c906 MOV AR1,@#03h --> partyToProc = i;
00051e: f7080001 ADD #1,@#04h --> numPartyToProc++;
000522: DW$L$_FctConfProcParty$4$E:
000522: L30:
000522: DW$L$_FctConfProcParty$5$B:
000522: f7000001 ADD #1,@#00h
000526: ed0cbf MOV dbl(@#06h),XAR3
000529: aa00 MOV @#00h,AR2
00052b: a96d004f MOV *AR3(#004fh),AR1
00052f: 12a494 CMPU AR2 < AR1, TC1
000532: 0464d2 BCC L29,TC1
000535: DW$L$_FctConfProcParty$5$E:
000535: L31:
000535: a908 MOV @#04h,AR1
000537: 040969 BCC L33,AR1 == #0 --> numPartyToProc > 0
00053a: 3c00 MOV #0,AC0
00053c: eb1008 MOV AC0,dbl(@#08h)
00053f: eb1408 MOV AC0,dbl(@#0ah)
000542: 6c000000 CALL _FctConfGetHandles
000546: c404 MOV T0,@#02h
000548: ed0cbf MOV dbl(@#06h),XAR3 --> blockChannel = ...
00054b: df0605 MOV uns(@#03h),AC0
00054e: 90b1 MOV XAR3,AC1
000550: 2410 ADD AC1,AC0
000552: 900b MOV AC0,XAR3
000554: a96d0048 MOV *AR3(#0048h),AR1
000558: 181f09 AND #31,AR1,AC0
00055b: c00a MOV AC0,@#05h
00055d: ec108e AMAR @#08h,XAR0
000560: ec149e AMAR @#0ah,XAR1
000563: 6c000000_2304 CALL _FctConfGetHandles || MOV AC0,T0
000569: a404 MOV @#02h,T0
00056b: 6c000000 CALL _FctConfGetHandles
00056f: ed0cbf MOV dbl(@#06h),XAR3
000572: df0605 MOV uns(@#03h),AC0
000575: 90b1 MOV XAR3,AC1
000577: 2410 ADD AC1,AC0
000579: 900b MOV AC0,XAR3
00057b: dc6d000008 BTST #0,*AR3(#0008h),TC1
000580: 6674 BCC L32,!TC1
000582: a40a MOV @#05h,T0
000584: ed108f MOV dbl(@#08h),XAR0
000587: ed149f MOV dbl(@#0ah),XAR1
00058a: 6c000000 CALL _FctConfGetHandles
00058e: L32:
00058e: ed0cbf MOV dbl(@#06h),XAR3
000591: df0605 MOV uns(@#03h),AC0 --> BlockInfo[partyToProc].I
000594: 90b1 MOV XAR3,AC1
000596: 2410 ADD AC1,AC0
000598: 900b MOV AC0,XAR3
00059a: 1448b4 AADD #72,AR3
00059d: f461bfff AND #49151,*AR3
0005a1: 4a11 B L34
0005a3: L33:
0005a3: a002_3d08 MOV @#01h,AC0 || MOV #0,AR0
0005a7: 3c75_110704 MOV #7,T1 || SFTL AC0,#4,AC0
0005ac: 7e5c0140 OR #23553,AC0,T0
0005b0: 6c000000 CALL _FctConfGetHandles
0005b4: L34:
0005b4: L35:
0005b4: 4e0d AADD #13,SP
0005b6: 4804 RET
Code compiled with –O3: error, local variables partyToProc and numPartyToProc are overwritten!!!
000176: _FctConfProcParty:
000176: 5066 PSH T2
000178: 5076 PSH T3
00017a: 50d5 PSHBOTH XAR5
00017c: 50f5 PSHBOTH XAR7
00017e: 4efb AADD #-5,SP
000180: 6c000000_3d14 CALL _fctConfUpdateParties || MOV #1,T0
000186: 6d1400a8 BCC L14,T0 != #0
00018a: 5240 MOV T0,HI(AC0)
00018c: 100700 SFTL AC0,#0,AC0
00018f: 1e5210 MPYK #82,AC0,AC1
000192: 7a00000a MOV #0 << #16,AC0
000196: 7e000000 OR #0,AC0,AC0
00019a: 2410 ADD AC1,AC0
00019c: 900d MOV AC0,XAR5
00019e: 3c06 MOV #0,T2 partyToProc = 0;
0001a0: 3c09 MOV #0,AR1 numPartyToProc = 0;
0001a2: aaad004f MOV *AR5(#004fh),AR2
0001a6: 040a21 BCC DW$L$_FctConfProcParty$4$E,AR2 == #0
0001a9: 421a SUB #1,AR2
0001ab: 52ae MOV AR2,BRC0
0001ad: 4a97_3d0c RPTBLOCAL #0x0001c8 || MOV #0,AR4
0001b1: L10:
0001b1: DW$L$_FctConfProcParty$4$B:
0001b1: 90d1 MOV XAR5,AC1
0001b3: 7dffff0c AND #65535,AR4,AC0
0001b7: 2410 ADD AC1,AC0
0001b9: 900b MOV AC0,XAR3
0001bb: dc6d000048 BTST #0,*AR3(#0048h),TC1
0001c0: 22c6_9ee4 XCCPART TC1 || MOV AR4,T2 partyToProc = i
0001c4: 4019_9ee4 XCCPART TC1 || ADD #1,AR1 numPartyToProc++
0001c8: 401c ADD #1,AR4
0001ca: DW$L$_FctConfProcParty$4$E:
0001ca: L11:
0001ca: 040954 BCC L13,AR1 == #0
0001cd: 3c00 MOV #0,AC0
0001cf: eb0008 MOV AC0,dbl(@#00h)
0001d2: ed00bf MOV dbl(@#00h),XAR3
0001d5: eb04b5 MOV XAR3,dbl(@#02h)
0001d8: 6c000000 CALL _fctConfUpdateParties
0001dc: 2247 MOV T0,T3
0001de: 90d1 MOV XAR5,AC1 blockChannel = ...
0001e0: 7dffff06 AND #65535,T2,AC0
0001e4: 2410 ADD AC1,AC0
0001e6: 900f MOV AC0,XAR7
0001e8: ece1de AMAR *AR7,XAR5
0001eb: 1448d4 AADD #72,AR5
0001ee: a9a1 MOV *AR5,AR1 !!!OVERWRITE numPartyToProc
0001f0: 181f69 AND #31,AR1,T2 !!!OVERWRITE partyToProc
0001f3: a9a1 MOV *AR5,AR1
0001f5: 181f49 AND #31,AR1,T0
0001f8: ec008e AMAR @#00h,XAR0
0001fb: ec049e AMAR @#02h,XAR1
0001fe: 6c000000 CALL _fctConfUpdateParties
000202: 6c000000_2374 CALL _fctConfUpdateParties || MOV T3,T0
000208: dced000008 BTST #0,*AR7(#0008h),TC1
00020d: 6674 BCC L12,!TC1
00020f: ed008f MOV dbl(@#00h),XAR0
000212: ed049f MOV dbl(@#02h),XAR1
000215: 6c000000_2364 CALL _fctConfUpdateParties || MOV T2,T0
00021b: L12:
00021b: f4a1bfff AND #49151,*AR5
00021f: 4a11 B L14
000221: L13:
000221: 2240 MOV T0,AC0
000223: 3c75_110704 MOV #7,T1 || SFTL AC0,#4,AC0
000228: 7e5c0140 OR #23553,AC0,T0
00022c: 6c000000_3d08 CALL _fctConfUpdateParties || MOV #0,AR0
000232: L14:
000232: 4e05 AADD #5,SP
000234: 50f4 POPBOTH XAR7
000236: 50d4 POPBOTH XAR5
000238: 5072 POP T3
00023a: 5062 POP T2
00023c: 4804 RET