News:

Download Pelles C here: http://www.pellesc.se

Main Menu

Maybe a optimization bug.

Started by ander_cc, Yesterday at 03:38:30 PM

Previous topic - Next topic

ander_cc

Today, I showed a sample code about while statement to my students. But got a error result. :-[
I think it might be a bug related to optimization. Because when I close optimization, I can get the right value.

Pelles C v14, Windows 11 pro Chinese (Samplify) 25H2
You cannot view this attachment.

John Z

#1
Hi ander_cc,

A good lesson there similar to a lawyers credo "In Court don't ask a question if you don't already know the answer"  the corollary to teaching, esp programing, is "In classroom don't use an example you haven't tested"  :)  (half kidding you, no offense meant)

But seriously yes there have been, and are issues, with using the optimizations and extensive testing is always needed for these.  I have many programs using optimizations successfully.

Perhaps Pelle can find the cause of this short program, meanwhile

Your program can use optimizations by using this 'fix':

volatile int i=1;

which, as I understand it inhibits the optimizer from making assumptions about i.

John Z

As an aside I would recommend not using any optimizations for teaching.  Optimizing should be performed by the students learning programing.

Cheers,

Vortex

Compiling the code with the maximize speed option :

#include <stdio.h>

int main(void)
{
    int i=1, sum=0;
    while (i<=100)
    {
        //printf("i=%d\n",i);
        sum=sum+i;
        i++;
    }
    printf("i=%d\n",i);
    printf("sum=%d\n",sum);
    return 0;
}

Disassembling the object module :

_text  SEGMENT PARA 'CODE'                            ; section number 1

main    PROC
        sub    rsp, 40                                ; 0000 _ 48: 83. EC, 28
        lea    rcx, [@152]                            ; 0004 _ 48: 8D. 0D, 00000000(rel)
        call    printf                                  ; 000B _ E8, 00000000(rel)
        lea    rcx, [@154]                            ; 0010 _ 48: 8D. 0D, 00000000(rel)
        mov    edx, 5050                              ; 0017 _ BA, 000013BA
        call    printf                                  ; 001C _ E8, 00000000(rel)
        xor    eax, eax                                ; 0021 _ 31. C0
        add    rsp, 40                                ; 0023 _ 48: 83. C4, 28
        ret                                            ; 0027 _ C3
main    ENDP

_text  ENDS

.xdata  SEGMENT ALIGN(8) 'CONST'                        ; section number 3

..?xdatasym1 label byte
        db 01H, 04H, 01H, 00H, 04H, 42H, 00H, 00H      ; 0000 _ .....B..

.xdata  ENDS

.rdata  SEGMENT PARA 'CONST'                            ; section number 4

@154    label byte
        db 73H, 75H, 6DH, 3DH, 25H, 64H, 0AH, 00H      ; 0000 _ sum=%d..

@152    label byte
        db 69H, 3DH, 25H, 64H, 0AH, 00H                ; 0008 _ i=%d..

.rdata  ENDS

The first printf call should take a second parameter, edx pointint the value of i. Since this statement is missing, printf will print the random value stored by the register edx.
Code it... That's all...

TimoVJL

For small tests quick look with podump.exe

Disasm obj Add-In
May the source be with you

Vortex

Hi Timo,

Here is the output of Podump :

\PellesC\bin\podump.exe /DISASM output\sum.obj
sub               rsp,28
lea               rcx,[@152]
call              printf
lea               rcx,[@154]
mov               edx,13BA
call              printf
xor               eax,eax
add               rsp,28
ret
Code it... That's all...

ander_cc

Quote from: John Z on Yesterday at 04:43:36 PMHi ander_cc,

A good lesson there similar to a lawyers credo "In Court don't ask a question if you don't already know the answer"  the corollary to teaching, esp programing, is "In classroom don't use an example you haven't tested"  :)  (half kidding you, no offense meant)

But seriously yes there have been, and are issues, with using the optimizations and extensive testing is always needed for these.  I have many programs using optimizations successfully.

Perhaps Pelle can find the cause of this short program, meanwhile

Your program can use optimizations by using this 'fix':

volatile int i=1;

which, as I understand it inhibits the optimizer from making assumptions about i.

John Z

As an aside I would recommend not using any optimizations for teaching.  Optimizing should be performed by the students learning programing.

Cheers,
Yes, It really embarrassed me at that time. I realized I had forgotten to turn off the optimization. Then I explained the reason to my students, and turned off optimization to test the code again, and used gcc -o2 to test the code again.

TimoVJL

from Clang
main:
00000000  4883EC28                sub rsp, 28h
00000004  488D0D00000000          lea rcx, [??_C@_05BKKKKIID@i?$DN?$CFd?6?$AA@]
0000000B  BA65000000              mov edx, 65h
00000010  E800000000              call printf
00000015  488D0D00000000          lea rcx, [??_C@_07MJFEPNKA@sum?$DN?$CFd?6?$AA@]
0000001C  BABA130000              mov edx, 13BAh
00000021  E800000000              call printf
00000026  31C0                    xor eax, eax
00000028  4883C428                add rsp, 28h
0000002C  C3                      ret
As Vortex mentioned, this was missingmov edx, 65h
May the source be with you