qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/2] milkymist-pfpu: fix GCC 5.0.0 aggressive-lo


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 2/2] milkymist-pfpu: fix GCC 5.0.0 aggressive-loop-optimizations warning
Date: Fri, 20 Feb 2015 15:36:18 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0


On 20/02/2015 15:18, Radim Krčmář wrote:
> man gcc:
>   Warn if in a loop with constant number of iterations the compiler
>   detects undefined behavior in some statement during one or more of
>   the iterations.
> 
> Refactored the code a bit to avoid the GCC warning, in an objectionable
> way,
>   hw/misc/milkymist-pfpu.c: In function ‘pfpu_write’:
>   hw/misc/milkymist-pfpu.c:365:20: error: loop exit may only be reached after 
> undefined behavior [-Werror=aggressive-loop-optimizations]
>                    if (i++ >= MICROCODE_WORDS) {
>                       ^
>   hw/misc/milkymist-pfpu.c:167:14: note: possible undefined statement is here
>        uint32_t insn = s->microcode[pc];
>                 ^
> 
> Signed-off-by: Radim Krčmář <address@hidden>
> ---
>  hw/misc/milkymist-pfpu.c | 18 ++++++++----------
>  1 file changed, 8 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/misc/milkymist-pfpu.c b/hw/misc/milkymist-pfpu.c
> index 609f33f9cd14..133f5b8c5153 100644
> --- a/hw/misc/milkymist-pfpu.c
> +++ b/hw/misc/milkymist-pfpu.c
> @@ -164,6 +164,13 @@ output_queue_advance(MilkymistPFPUState *s)
>  static int pfpu_decode_insn(MilkymistPFPUState *s)
>  {
>      uint32_t pc = s->regs[R_PC];
> +
> +    if (pc > MICROCODE_WORDS) {
> +        error_report("milkymist_pfpu: too many instructions "
> +                     "executed in microcode. No VECTOUT?");
> +        return 0;
> +    }
> +
>      uint32_t insn = s->microcode[pc];
>      uint32_t reg_a = (insn >> 18) & 0x7f;
>      uint32_t reg_b = (insn >> 11) & 0x7f;
> @@ -348,7 +355,6 @@ static int pfpu_decode_insn(MilkymistPFPUState *s)
>  static void pfpu_start(MilkymistPFPUState *s)
>  {
>      int x, y;
> -    int i;
>  
>      for (y = 0; y <= s->regs[R_VMESHLAST]; y++) {
>          for (x = 0; x <= s->regs[R_HMESHLAST]; x++) {
> @@ -359,15 +365,7 @@ static void pfpu_start(MilkymistPFPUState *s)
>              s->gp_regs[GPR_Y] = y;
>  
>              /* run microcode on this position */
> -            i = 0;
> -            while (pfpu_decode_insn(s)) {
> -                /* decode at most MICROCODE_WORDS instructions */
> -                if (i++ >= MICROCODE_WORDS) {

Isn't the fix just to say "++i" instead of "i++"?

Paolo

> -                    error_report("milkymist_pfpu: too many instructions "
> -                            "executed in microcode. No VECTOUT?");
> -                    break;
> -                }
> -            }
> +            while (pfpu_decode_insn(s));
>  
>              /* reset pc for next run */
>              s->regs[R_PC] = 0;
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]