On 15 February 2016 at 11:29, Richard Henderson <address@hidden> wrote:
----------------------------------------------------------------
Richard Henderson (5):
tcg: Work around clang bug wrt enum ranges, part 2
tcg: Implement indirect memory registers
tcg: Allocate indirect_base temporaries in a different order
target-sparc: Tidy global register initialization
target-sparc: Use global registers for the register window
target-sparc/translate.c | 196 ++++++++++++++++++++++-------------------------
tcg/tcg.c | 138 +++++++++++++++++++++++----------
tcg/tcg.h | 2 +
3 files changed, 192 insertions(+), 144 deletions(-)
This failed to build on the i686-w64-mingw32 compiler
("i686-w64-mingw32-gcc (GCC) 4.8.2", from the Ubuntu
gcc-mingw-w64-i686 package version 4.8.2-10ubuntu2+12):
target-sparc/translate.c: In function ‘gen_intermediate_code’:
target-sparc/translate.c:299:24: error: array subscript is above array
bounds [-Werror=array-bounds]
return cpu_regs[reg];
^
Fiddling around with the source file to see which call to
gen_dest_gpr() is provoking this shows that it's the one
in gen_ldda_asi() at line 2157 -- if I change the second
argument from 'rd + 1' to 'rd' it compiles OK.
Changing the call site of gen_ldda_asi at line 4727 so its last
argument is 'rd & ~1' rather than 'rd' also suppresses the
error. (That can't possibly change the semantics because we've
just done "if (rd & 1) goto illegal_insn;"...)
I'm generally reluctant to suggest compiler bugs, but this does
look rather like a compiler bug...