ICC 13.0.1 silently generates wrong code under heavy XMM register pressure

ICC 13.0.1 silently generates wrong code under heavy XMM register pressure

ICC 13.0.1 silently generates incorrect code when using 15 specified XMM registers. 

It also fails (but loudly) when attempting to use 16 specified XMM registers.  

See attached test code and output of "objdump -d".

 

 

 

 

 

 

4 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Forgot to mention (and can't figure out how to edit a post): gcc 4.7.2 and clang 3.2 both work correctly.

It looks OK with the 14.0.1 intel64 compiler. With 13.1 it quits without generating that part of the object file.

Thanks for looking at this.  I finally upgraded to 14.0.1, and retested.   While the results have changed, I do _not_ agree that  is working.  In fact, by some measure it has gotten worse.

The previously correct 14 register case now adds an extra move at the end.  

The 15 register case repeatedly overwrites XMM15 rather than moving each register by one.

The 16 register case (-DCATASTROPHIC_ERROR) still dies with a catastrophic error.

Again, all of these work correctly in both gcc and clang:  the assembly is as desired, and the 16 register case does not crash.  Attached are objdump -d outputs for "{icc,gcc,clang} -msse -O2 -Wall -c icc_register_pressure_bug.c -o bug.o".   

 

Leave a Comment

Please sign in to add a comment. Not a member? Join today