delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2005/11/04/07:16:35

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
From: cbramix AT libero DOT it
Newsgroups: comp.os.msdos.djgpp
Subject: missing optimization?
Date: 4 Nov 2005 04:02:39 -0800
Organization: http://groups.google.com
Lines: 92
Message-ID: <1131105759.132511.231360@g47g2000cwa.googlegroups.com>
NNTP-Posting-Host: 151.25.138.102
Mime-Version: 1.0
X-Trace: posting.google.com 1131105764 9772 127.0.0.1 (4 Nov 2005 12:02:44 GMT)
X-Complaints-To: groups-abuse AT google DOT com
NNTP-Posting-Date: Fri, 4 Nov 2005 12:02:44 +0000 (UTC)
User-Agent: G2/0.2
X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98),gzip(gfe),gzip(gfe)
Complaints-To: groups-abuse AT google DOT com
Injection-Info: g47g2000cwa.googlegroups.com; posting-host=151.25.138.102;
posting-account=2QKFyAwAAACmXX-HdPjfH6A4KB1YwZKs
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Hello,
I discovered that GCC makes a strange thing when compiling the sources
for my embedded application.
I attached a very simple C source for demonstrating the fact.
------------------------------------
#include <stdio.h>

typedef struct {
    int entry;
} data_t;

data_t data;

void function1(int val)
{
    if ((data.entry -= val) < 0) {
        printf("<");
    }
}

void function2(int val)
{
    int v = data.entry;

    if ( (v -= val) < 0) {
        data.entry = v;
        printf("<");
    } else {
        data.entry = v;
    }
}

------------------------------------
'function1' and 'function2' make the same thing.
But the generated assembly isn't exacly what I wanted...
Here I just put the code of the functions:

_function1:
    movl _data, %eax
    subl 4(%esp), %eax
    testl %eax, %eax
    movl %eax, _data
    js  L5
    ret
.p2align 4,,15
L5:
    movl $60, 4(%esp)
    jmp _putchar

_function2:
    movl _data, %eax
    subl 4(%esp), %eax
    js	L9
    movl %eax, _data
    ret
.p2align 4,,15
L9:
    movl %eax, _data
    movl $60, 4(%esp)
    jmp _putchar

Into the code of 'function1' the instruction 'subl 4(%esp), %eax'
already changes the status of the FLAGS.
So I can't understand why it makes an additional 'testl %eax, %eax'.
When I copy my value into a local variable like I did into 'function2',
it works as I expected.
Unfortunately, with this solution I must save the modified value with
the 'data.entry=v;' into both directions, while it could be safely
placed between the SUB and JS opcodes.
If compiler is *newer* than 2.95, then it puts the TEST opcode.
Older versions work fine when accessing the structure directly too.
I compiled the source with:

gcc -march=i486 -mtune=i486 -mpreferred-stack-boundary=2 -Wall demo.c
-S -fomit-frame-pointer -O2

I tried to increase the optimization level but it didn't change.
Changing the 'i486' to another microprocessor didn't change too.

The application seems to run without problem.
However, those optimizations are missed in several critical points.
I would feel better if the code into these points could be reduced to
the minimum.

Do you have some good idea?
What am I doing wrong in your opinion?
I would like to avoid changes into this old source, if it's possible...

Sincerely,

Carlo Bramini

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019