This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/24209] strange instruction selected for an annuled delay slot
- From: "steven at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 18 Apr 2013 21:06:17 +0000
- Subject: [Bug rtl-optimization/24209] strange instruction selected for an annuled delay slot
- Auto-submitted: auto-generated
- References: <bug-24209-4 at http dot gcc dot gnu dot org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24209
Steven Bosscher <steven at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed|2005-10-05 11:06:49 |2013-04-18 11:06:49
CC|gcc-bugs at gcc dot gnu.org |steven at gcc dot gnu.org
--- Comment #3 from Steven Bosscher <steven at gcc dot gnu.org> 2013-04-18 21:06:17 UTC ---
Current trunk still picks that ldsb insn for the delay slot.
Here's what it produces:
.file "t.c"
.section ".text"
.align 4
.global PointToRowCol
.type PointToRowCol, #function
.proc 020
PointToRowCol:
sethi %hi(term+4), %g1
sethi %hi(firstValidRow), %g2
ld [%g1+%lo(term+4)], %g1
ld [%g2+%lo(firstValidRow)], %g2
ld [%g1], %g4
ld [%g1+12], %g3
sub %o0, %g4, %o0
sra %o0, 31, %o5
wr %o5, 0, %y
ld [%g3+4], %o5
nop
nop
sdiv %o0, %o5, %o0
cmp %o0, %g2
bl,a .L12
ldsb [%g1+16], %o4
sethi %hi(lastValidRow), %o5
ld [%o5+%lo(lastValidRow)], %o5
cmp %o0, %o5
bg .L10
mov %o0, %g2
.L2:
ldsb [%g1+16], %o4
.L12:
cmp %o4, 0
bne .L4
mov 0, %o5
ld [%g3+8], %o5
.L4:
add %o5, %g4, %g4
sub %o1, %g4, %o1
sra %o1, 31, %g4
wr %g4, 0, %y
ld [%g3], %g4
nop
nop
sdiv %o1, %g4, %o1
cmp %o1, 0
bl,a .L8
st %g2, [%o2]
ld [%g1+4], %g1
add %g1, 1, %g1
cmp %o1, %g1
bg .L11
st %g2, [%o2]
jmp %o7+8
st %o1, [%o3]
.L11:
mov %g1, %o1
jmp %o7+8
st %o1, [%o3]
.L10:
b .L2
mov %o5, %g2
.L8:
mov 0, %o1
jmp %o7+8
st %o1, [%o3]
.size PointToRowCol, .-PointToRowCol
.ident "GCC: (GNU) 4.9.0 20130418 (experimental) [trunk revision
198052]"
.section .note.GNU-stack,"",@progbits
for this test case:
typedef char Boolean;
typedef struct {
int width;
} SbInfo;
struct _vtwin {
int f_width;
int f_height;
SbInfo sb_info;
};
typedef struct {
int border;
int max_col;
struct _vtwin *whichVwin;
} TScreen;
typedef struct _Misc {
Boolean useRight;
} Misc;
typedef struct _XtermWidgetRec {
TScreen screen;
Misc misc;
} XtermWidgetRec, *XtermWidget;
extern int firstValidRow, lastValidRow;
extern XtermWidget term;
void
PointToRowCol(int y, int x, int *r, int *c)
{
TScreen *screen = &term->screen;
int row, col;
row = (y - screen->border) / screen->whichVwin->f_height;
if (row < firstValidRow)
row = firstValidRow;
else if (row > lastValidRow)
row = lastValidRow;
col = (x - (((term->misc.useRight) ? 0 : screen->whichVwin->sb_info.width) +
screen->border) ) / screen->whichVwin->f_width;
if (col < 0)
col = 0;
else if (col > screen->max_col + 1)
col = screen->max_col + 1;
*r = row;
*c = col;
}
with options: "-mcpu=v8 -m32 -O2".