This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
optimization/7147: ifcvt.c problem (regression)
- From: Franz dot Sirl-kernel at lauterbach dot com
- To: gcc-gnats at gcc dot gnu dot org
- Cc: kevin dot hendricks at sympatico dot ca
- Date: 27 Jun 2002 22:55:16 -0000
- Subject: optimization/7147: ifcvt.c problem (regression)
- Reply-to: Franz dot Sirl-kernel at lauterbach dot com
>Number: 7147
>Category: optimization
>Synopsis: ifcvt.c problem (regression)
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Thu Jun 27 15:56:02 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Franz.Sirl-kernel@lauterbach.com
>Release: current gcc-3_1-branch
>Organization:
>Environment:
powerpc-linux-gnu
>Description:
This testcase is derived from a reported c++ mozilla miscompilation. It fails at -O and works fine with -O -fexpensive-optimizations.
My guess so far is that ifcvt.c is confused by the multiple SETs of pseudo 117 (from .rtl):
(insn 27 25 28 (set (reg/v:SI 117)
(reg:SI 3 r3)) -1 (nil)
(nil))
(insn 28 27 29 (set (reg:CC 120)
(compare:CC (reg/v:SI 117)
(const_int 0 [0x0]))) -1 (nil)
(nil))
(insn 29 28 31 (set (reg/v:SI 117)
(eq:SI (reg:CC 120)
(const_int 0 [0x0]))) -1 (nil)
(nil))
(jump_insn 31 29 32 (set (pc)
(label_ref 34)) -1 (nil)
(nil))
(barrier 32 31 33)
(note 33 32 34 0x30084680 NOTE_INSN_BLOCK_END)
(code_label 34 33 35 3 ("lab1") "" [0 uses])
(note 35 34 37 0x300846c0 NOTE_INSN_BLOCK_END)
(insn 37 35 38 (set (reg:CC 121)
(compare:CC (reg/v:SI 117)
(const_int 0 [0x0]))) -1 (nil)
(nil))
(jump_insn 38 37 40 (set (pc)
(if_then_else (eq (reg:CC 121)
(const_int 0 [0x0]))
(label_ref 48)
(pc))) -1 (nil)
(nil))
Somehow the inversion via insn 28 and 29 isn't accounted for.
This is a regression from gcc-2.95.4.
>How-To-Repeat:
Compile with -O on powerpc-linux-gnu:
extern void abort (void);
extern void exit (int);
int sub1 (int val)
{
return val;
}
int testcond (int val)
{
int flag1;
{
int t1 = val;
{
int t2 = t1;
{
flag1 = sub1 (t2) ==0;
goto lab1;
};
}
lab1: ;
}
if (flag1 != 0)
return 0x4d0000;
else
return 0;
}
int main (void)
{
if (testcond (1))
abort ();
exit (0);
}
>Fix:
hacking stmt.c like that fixes the bug:
int
preserve_subexpressions_p ()
{
rtx insn;
if (flag_expensive_optimizations)
return 1;
if (optimize == 0 || cfun == 0 || cfun->stmt == 0 || loop_stack == 0)
return 0;
+ // make ifcvt happy
+ return 1;
+
insn = get_last_insn_anywhere ();
return (insn
&& (INSN_UID (insn) - INSN_UID (loop_stack->data.loop.start_label)
< n_non_fixed_regs * 3));
}
>Release-Note:
>Audit-Trail:
>Unformatted: