This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Ti Compiler-Optimizer problem

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