Readme for C2000 Code Generation Tools v21.12.0.STS
Table of Contents
Short-Term Support Release
The C2000 CGT v21.12.0.STS release is an STS (Short-Term Support) release.
Definitions
Short-Term Support (STS) release: All STS branches will be made reactive upon creation. A patch release for this branch will only be created for production stop issues and will only contain fixes for the production stop issues. For all other issues, users are advised to wait for the next STS branch, which may also contain new features. STS releases will occur approximately every 3 months up until the first LTS release in a release stream.
Long-Term Support (LTS) release: The LTS branch will be active upon creation. The branch will be active for at least 2 years. Production stop defects will be addressed within 2 weeks of being reported. Critical defects will be addressed within 90 days. Defect repairs are proactively applied to each release stream. The LTS release is intended for customers to lock down on tools.
Compiler Downloads and Documentation
Documentation for the “TI C2000 Optimizing Compiler User’s Guide” and the “TI C2000 Assembly Language User’s Guide” is available online at:
https://www.ti.com/tool/C2000-CGT
TI E2E Community
Questions concerning TI Code Generation Tools can be posted to the TI E2E Community forums at:
The following is the top-level webpage for all of TI’s Code Generation Tools.
If submitting a defect report, please attach a scaled-down test case with command-line options and the compiler version number to allow us to reproduce the issue easily.
Defect Tracking Database
Compiler defect reports can be tracked at the Development Tools bug database at:
New Features:
Interrupt save/restore efficiency improvement
The C2000 compiler now only saves/restores any registers that were used in an interrupt service routine (ISR). Additionally, if an ISR makes function calls, then all save-on-call (SoC) registers will get saved/restored. For FPU compilations, the RB register is saved/restored for all low priority ISRs, however, for high priority ISRs, the RB register is only saved/restored if the ISR may use an RPTB instruction.
The compiler user guide states:
“If a C/C++ interrupt routine does not call any other functions, only those registers that the interrupt handler uses are saved and restored”
However, prior to this update, above has not been the case since at least release 6.4 and the actual behavior has been to save/restore all SoC registers as long as any single SoC register was used.
Performance improvements
Improvements in reducing register spilling
The C2000 compiler has a new feature for reducing register spilling. During register allocation (selection of registers), if no registers are available, then the compiler must spill a register to memory (or another register) in order to make it available for register allocation.
A new optimization pass has been enabled for compilations with --opt_level=2 or higher and --float_support=fpu32/fpu64. If register spilling is detected, the compiler will generate a new instruction schedule to alleviate register pressure (shorten register use lifetimes) which should in turn reduce register spilling.Keep global float/double variables in registers
The C2000 compiler has a new optimization that will attempt to keep global float/double variables in registers if the device has fpu register support. As a simple example, prior to this optimization, below loop:
float flt;
would generate this assembly that loads/stores the float variable from memory during each iteration (with --opt_level=2):
for(i=0;i<2000;i++)
{
flt = flt + flt;
}
MOVL XAR6,#1999
which now is improved to this sequence that keeps the float variable in R2H during the loop:
loop:
MOVW DP,#flt
MOV32 R0H,@flt
MOV32 R1H,@flt
ADDF32 R0H,R0H,R1H
NOP
MOV32 @flt,R0H
BANZ loop,AR6—
MOVW DP,#flt
MOVL XAR6,#1999
MOV32 R2H,@flt
loop:
ADDF32 R2H,R2H,R2H
BANZ loop,AR6—If-conversion improvements
The current if-conversion optimizations for the C2000 compiler have been extended with below additional use cases.
This sequence:
MOVL XAR4,#||t||
is instead generated without the branch:
TBIT *+XAR4[0],#1
MOVB XAR0,#8,TC
B ||label||,TC
MOVB XAR0,#0
label:
MOVL XAR4,#||t||
And this sequence:
MOVB XAR0,#0
TBIT *+XAR4[0],#1
MOVB XAR0,#8,TC
TBIT *+XAR5[0],#2
is instead generated without the branch:
B label,NTC
MOV AH,AR0
ORB AH,#0x04
MOVZ AR0,AH
label:
TBIT *+XAR5[0],#2
MOV AH,AR0
ORB AH,#0x04
MOV AR0,AH,TC
Improved loads of 16-bit constants to ACC register
Below accumulator load of 16-bit constants:
MOVL XAR4,#256
is now directly loaded to the ACC register:
MOVL ACC,XAR4
MOV ACC,#256
Resolved defects
Resolved defects in v21.12.0.STS:
ID | Summary |
---|---|
CODEGEN-9423 | C28 high priority fpu interrupt routines may not always save/restore RB register when isr uses RPTB |
CODEGEN-9422 | C28 –isr_save_vcu_regs=on does not always save/restore VCU registers |
CODEGEN-9399 | Temp file name collison causes compilation failure at –opt_level=4 |
CODEGEN-9330 | Severe slowdown of link-time DWARF compaction in COFF projects |
CODEGEN-9245 | Compiler manual incorrectly states switch tables go in the .econst section |
CODEGEN-9019 | Compiler user guide spru514 incorrectly lists intrinsics __fmin64 __fmax64 |
Known defects
Known defects in v21.12.0.STS:
ID | Summary |
---|---|
CODEGEN-9517 | Using a compound statement inside parenthesis in C++ causes the compiler to fail with INTERNAL ERROR: ac2000 experienced a segmentation fault |
CODEGEN-9407 | Incorrect initialization of array of structures of length determined by initialization values |
CODEGEN-9046 | C2000 compiler manual does not explain the layout of bit fields which are larger than 16-bits |
CODEGEN-8576 | Loop that iterates a very large number of times causes compiler to fail with: Optimizer terminated abnormally |
CODEGEN-8528 | Assembler incorrectly issues the warning: Register write access is in the delay slot of a write of the same register |
CODEGEN-8471 | Hex utility, when splitting a section as required by the bootloader, ignores the section alignment for the second part of the split |
CODEGEN-8462 | LFU: CLA .scratchpad not currently being initialized during LFU warm start |
CODEGEN-8377 | C++ header files do not build clean with –issue remarks |
CODEGEN-8214 | Rounding error in floating point division of constant values |
CODEGEN-7388 | The option –preproc_dependency mishandles spaces in directory names |
CODEGEN-6509 | Compiler error: no instance of function template matches the argument list |
CODEGEN-6070 | Erroneous “redeclared with incompatible type” involving two tagless structs with same form |
CODEGEN-5179 | When a symbol is remapped, DW_TAG_TI_branch/DW_AT_name is not updated |
CODEGEN-5078 | Simple syntax error causes assembler to fail with INTERNAL ERROR |
CODEGEN-4985 | Typo on ULP Advisor message |
CODEGEN-4960 | Using –gen_profile_info with code with CLA source fails to build |
CODEGEN-4342 | cerr.tie() returns the wrong value |
CODEGEN-4329 | Initializing unordered_map with an initializer_list fails with -o2 or higher |
CODEGEN-4323 | 1 ULP rounding error in double addition |
CODEGEN-4318 | libcxx/include/random uses unsigned for unsigned long |
CODEGEN-4305 | Compiler aborts with excessive inlining of C++ functions |
CODEGEN-4298 | Internal error when passing a temporary array of objects |
CODEGEN-4297 | Cannot take the address of std::ctype<char>::table_size |
CODEGEN-4296 | Undefined symbol isblank with -g or -ooff |
CODEGEN-4290 | wstring runtime failure - likely bug in swprintf |
CODEGEN-4281 | Unexpected type returned by bitset [] operator |
CODEGEN-4276 | std::multimap::clear is not noexcept |
CODEGEN-4275 | std::num_get does not parse floating-point strings correctly |
CODEGEN-4259 | noexcept(typeid(d)) runtime fail on polymorphic class type |
CODEGEN-4258 | deeply nested lambda functions hang the codegen |
CODEGEN-4250 | regex_constants::ECMAScript not expected to be 0 |
CODEGEN-4248 | armcl allows non-default arguments to be specified after default arguments |
CODEGEN-4247 | Internal error when assigning default arguments to a parameter pack |
CODEGEN-4245 | Multiple non-variables may be declared using auto or decltype(auto) |
CODEGEN-4234 | No error generated for lambda-expression in default argument cannot capture any entity. |
CODEGEN-4158 | TI compiler does not emit clang error: constexpr function never produces a constant expression |
CODEGEN-4157 | error with using constexpr for return from end() with empty std::initializer_list |
CODEGEN-4132 | cannot find matching “==” operator definition |
CODEGEN-4124 | Failure to defer access control checks |
CODEGEN-4122 | decltype cannot be used as a destructor name |
CODEGEN-4119 | user-supplied allocator function is not called |
CODEGEN-4099 | Composing operations for valarray may fail to compile |
CODEGEN-4090 | Unimplemented core issue 475: std::uncaught_exception is not true when constructing the thrown object |
CODEGEN-4087 | wostringstream::fill(WCHAR_MAX) incorrectly sets the fill value to ' 'L. |
CODEGEN-4076 | Exception propagating out of noexcept function does not call std::terminate |
CODEGEN-4072 | Unimplemented core issue 1769: Catching a thrown derived class by reference to base clas |
CODEGEN-4071 | <regex> never throws error_ctype |
CODEGEN-4069 | std::linear_congruential_engine doesn't support 8-bit results |
CODEGEN-4044 | libcxx istreambuf_iterator points to end of string instead of character past match |
CODEGEN-1194 | hex2000, while using -b option, mistakenly states a section “falls in unconfigured memory” |
CODEGEN-1031 | C2000 float software multiply doesn't handle -1*INF properly |
CODEGEN-1028 | C2000 can't print 0 with %a format |
CODEGEN-580 | C2000 RTS float arithmetic functions do not round correctly |
CODEGEN-322 | Structure is not initialized correctly when using -o2 or -o3 optimization |
CODEGEN-104 | Linker gives misleading warning when dot expressions used in SECTION directive for .stack section |
CODEGEN-88 | strcmp doesn't correctly handle values with uppermost bit set |
CODEGEN-71 | Extern inline functions are not supported in the C/C++ Compiler with COFF ABI |
CODEGEN-63 | DWARF does not correctly represent variables stored in register pairs |
CODEGEN-62 | pow(2,x) has fairly significant rounding error |
CODEGEN-60 | printf gives wrong value for pointer when its value is incremented |
CODEGEN-56 | Forward reference in .space generates an internal error |