http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57813

            Bug ID: 57813
           Summary: Change of global variable ignored
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: daniel.oertwig at gmail dot com
            Target: avr51

Created attachment 30450
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30450&action=edit
Source code relating to the problem

Hi, I assume this to be a bug in how the compiler optimizes its code.
Unfortunately, I don't know enough about how the gcc works to narrow down the
source of the problem.

If it's me (or my code), please tell me what I am doing wrong.

Basically I have a function operating on a global variable. This function calls
another function which changes this global variable. But the changed value is
not used by the calling function afterwards.


Task * Task_getNextReady()
{
    uint8_t priority;
    if (taskInfo.ready[0]) priority = 0;
    else if (taskInfo.ready[1]) priority = 1;
    else if (taskInfo.ready[2]) priority = 2;
    else if (taskInfo.ready[3]) priority = 3;
    else if (taskInfo.ready[4]) priority = 4;
    else if (taskInfo.ready[5]) priority = 5;
    else if (taskInfo.ready[6]) priority = 6;
    else priority = 7;
    // Before call to function: taskInfo.ready[priority] == &task6
    // After call to function: taskInfo.ready[priority] == &task7
    // Return value = 10
    taskInfo.ready[priority]->wakeTime = Task_enforceTimeslice(priority);
    // Changed task6->wakeTime = 10
    // Unchanged task7->wakeTime
    // Return value is &task7, which is correct.
    return taskInfo.ready[priority];
}

I guess i could "solve" this by making the variable volatile, but I don't think
that this would be "correct".

Reply via email to