On Thu, Jun 16, 2016 at 3:07 PM, Richard Henderson <r...@twiddle.net> wrote: > On 06/16/2016 11:56 AM, Pranith Kumar wrote: >> Using gcc 6.1 for alpha-linux-user target we see the following build >> error: >> >> /mnt/devops/code/qemu/target-alpha/translate.c: In function ‘in_superpage’: >> /mnt/devops/code/qemu/target-alpha/translate.c:454:52: error: >> self-comparison always evaluates to true [-Werror=tautological-compare] >> && addr >> TARGET_VIRT_ADDR_SPACE_BITS == addr >> 63); >> >> Fix it by replacing (addr >> 63) by '1' which is what it evaluates to >> since addr is negative. >> >> Signed-off-by: Pranith Kumar <bobby.pr...@gmail.com> >> --- >> target-alpha/translate.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/target-alpha/translate.c b/target-alpha/translate.c >> index f9b2426..31da6ea 100644 >> --- a/target-alpha/translate.c >> +++ b/target-alpha/translate.c >> @@ -451,7 +451,7 @@ static bool in_superpage(DisasContext *ctx, int64_t addr) >> return ((ctx->tb->flags & TB_FLAGS_USER_MODE) == 0 >> && addr < 0 >> && ((addr >> 41) & 3) == 2 >> - && addr >> TARGET_VIRT_ADDR_SPACE_BITS == addr >> 63); >> + && addr >> TARGET_VIRT_ADDR_SPACE_BITS == 1); >> } > > This fix is incorrect. > > (1) addr is not always negative. > (2) in_superpage is only relevant for alpha-softmmu, where > TARGET_VIRT_ADDR_SPACE_BITS is not 63.
If you see line 2 of the condition you check for (addr < 0). Only if this evaluates to true do you check the right shift value of addr. Reg. (2), I think that is what gcc is erroring out for. TARGET_VIRT_ADDR_SPACE_BITS is 63 for linux-user and we are comparing (addr >> 63) with itself. GCC rightly says that it is a tautological compare and errors out. May be we can have a better work around. Thanks! -- Pranith