Bug 228521

Summary: c++ code crashes
Product: [Fedora] Fedora Reporter: Tianlin Wang <tianlin.wang>
Component: gccAssignee: Jakub Jelinek <jakub>
Status: CLOSED UPSTREAM QA Contact:
Severity: urgent Docs Contact:
Priority: medium    
Version: 6CC: tianlin.wang
Target Milestone: ---   
Target Release: ---   
Hardware: athlon   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2007-02-14 11:22:50 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Tianlin Wang 2007-02-13 15:49:38 UTC
Description of problem:
A c++ code generates 'Segmentation' message when it is complied with 
-O2. It works fine with other optimization levels such as -O,-O3.

Version-Release number of selected component (if applicable):
I only observed this bug in FC6. My machine is Atholon64

How reproducible:

/** The following code will end with 'Segmentation' if compiled with -O2 **/
/** It works fine with other optimization levels such -O, -O3 **/

/************ BEGIN OF CODE ***********/
#include <string>
#include <cstddef>

struct AA {
  int def;
};

struct BB {
  AA *alltype;
};

void compute(int n,BB *grand=NULL);


int main(int argc, char *argv[])
{
   compute(1);
   return 0;
}

void compute(int n,BB *grand)
{
  int t;
   for (t=0; t<n; t++) {
      if (grand) grand->alltype[t].def += 1;
   }
   return;
}

/********* END OF CODE **********/


Steps to Reproduce:
1. Compile the sample code with -O2
2. run it
3. you will see the 'Segmentation' on the screen
  
Actual results:
Segmentation

Expected results:


Additional info:

Comment 1 Jakub Jelinek 2007-02-13 16:11:48 UTC
Simplified C testcase:
struct S
{
  int *s;
};

void
test (int x, struct S *y)
{
  int i;
  for (i = 0; i < x; i++)
    {
      if (y)
        y->s[i] += 1;
    }
}

int
main ()
{
  test (1, (void *) 0);
  return 0;
}

This seems to be a RTL strength reduction bug, present also on vanilla
gcc-4_1-branch.  -O2 -fno-strength-reduce cures this.

Comment 2 Jakub Jelinek 2007-02-14 11:22:50 UTC
Tracking upstream.