|
From: <sv...@va...> - 2005-10-15 22:07:40
|
Author: njn
Date: 2005-10-15 23:07:28 +0100 (Sat, 15 Oct 2005)
New Revision: 4936
Log:
Cachegrind cleanups:
- Remove some unnecessary assertions.
- Add in some new ones.
- Make things more concise and readable by factoring out things like
"cgs->events[i+1]" into things like "ev2" in flushEvents().
Modified:
trunk/cachegrind/cg_main.c
Modified: trunk/cachegrind/cg_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/cachegrind/cg_main.c 2005-10-15 17:54:35 UTC (rev 4935)
+++ trunk/cachegrind/cg_main.c 2005-10-15 22:07:28 UTC (rev 4936)
@@ -540,10 +540,7 @@
{
tl_assert(cgs->bbInfo_i >=3D 0);
tl_assert(cgs->bbInfo_i <=3D cgs->bbInfo->n_instrs);
- if (cgs->bbInfo_i =3D=3D 0)
- return NULL;
- else
- return &cgs->bbInfo->instrs[ cgs->bbInfo_i - 1 ];
+ return &cgs->bbInfo->instrs[ cgs->bbInfo_i - 1 ];
}
=20
=20
@@ -564,6 +561,9 @@
InstrInfo* i_node;
InstrInfo* i_node2;
InstrInfo* i_node3;
+ Event* ev;
+ Event* ev2;
+ Event* ev3;
=20
i =3D 0;
while (i < cgs->events_used) {
@@ -576,9 +576,14 @@
/* generate IR to notify event i and possibly the ones
immediately following it. */
tl_assert(i >=3D 0 && i < cgs->events_used);
+
+ ev =3D &cgs->events[i];
+ ev2 =3D ( i < cgs->events_used-1 ? &cgs->events[i+1] : NULL );
+ ev3 =3D ( i < cgs->events_used-2 ? &cgs->events[i+2] : NULL );
+ =20
if (DEBUG_CG) {
VG_(printf)(" flush ");=20
- showEvent( &cgs->events[i] );
+ showEvent( ev );
}
=20
/* For any event we find the relevant InstrInfo. The following
@@ -588,76 +593,66 @@
most recently encountered IMark and so we use the
most-recently allocated instrs[] entry, which must exist. */
=20
- if (cgs->events[i].ekind =3D=3D Event_Ir) {
+ if (ev->ekind =3D=3D Event_Ir) {
/* allocate an InstrInfo and fill in its addr/size. */
i_node =3D reserve_InstrInfo( cgs );
- tl_assert(i_node);
init_InstrInfo( i_node,
- (Addr)cgs->events[i].iaddr, /* i addr */
- cgs->events[i].size /* i size */);
+ (Addr)ev->iaddr, /* i addr */
+ ev->size /* i size */);
} else {
/* use the most-recently allocated i_node but don't mess with
its internals */
i_node =3D find_most_recent_InstrInfo( cgs );
- /* it must actually exist */
- tl_assert(i_node);
- /* it must match the declared parent instruction of this
- event. */
- tl_assert(i_node->instr_addr =3D=3D cgs->events[i].iaddr);
+ /* it must match the declared parent instruction of this event.=
*/
+ tl_assert(i_node->instr_addr =3D=3D ev->iaddr);
}
=20
i_node_expr =3D mkIRExpr_HWord( (HWord)i_node );
=20
/* Decide on helper fn to call and args to pass it, and advance
i appropriately. */
- switch (cgs->events[i].ekind) {
+ switch (ev->ekind) {
case Event_Ir:
/* Merge with a following Dr/Dm if it is from this insn. */
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].iaddr =3D=3D cgs->events[i].iaddr
- && (cgs->events[i+1].ekind =3D=3D Event_Dr
- || cgs->events[i+1].ekind =3D=3D Event_Dm)) {
+ if (ev2 && (ev2->ekind =3D=3D Event_Dr || ev2->ekind =3D=3D =
Event_Dm)) {
+ tl_assert(ev2->iaddr =3D=3D ev->iaddr);
helperName =3D "log_1I_1Dr_cache_access";
helperAddr =3D &log_1I_1Dr_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i+1].dataEA,
- mkIRExpr_HWord( cgs->events[i+1].si=
ze ) );
+ ev2->dataEA,
+ mkIRExpr_HWord( ev2->size ) );
regparms =3D 3;
i +=3D 2;
}
/* Merge with a following Dw if it is from this insn. */
else
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].iaddr =3D=3D cgs->events[i].iaddr
- && cgs->events[i+1].ekind =3D=3D Event_Dw) {
+ if (ev2 && ev2->ekind =3D=3D Event_Dw) {
+ tl_assert(ev2->iaddr =3D=3D ev->iaddr);
helperName =3D "log_1I_1Dw_cache_access";
helperAddr =3D &log_1I_1Dw_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i+1].dataEA,
- mkIRExpr_HWord( cgs->events[i+1].si=
ze ) );
+ ev2->dataEA,
+ mkIRExpr_HWord( ev2->size ) );
regparms =3D 3;
i +=3D 2;
}
/* Merge with two following Irs if possible. */
else
- if (i < cgs->events_used-2=20
- && cgs->events[i+1].ekind =3D=3D Event_Ir
- && cgs->events[i+2].ekind =3D=3D Event_Ir) {
+ if (ev2 && ev3 && ev2->ekind =3D=3D Event_Ir && ev3->ekind =3D=
=3D Event_Ir)
+ {
helperName =3D "log_3I_0D_cache_access";
helperAddr =3D &log_3I_0D_cache_access;
=20
i_node2 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node2);
init_InstrInfo( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
- cgs->events[i+1].size /* i size */);
+ (Addr)ev2->iaddr, /* i addr */
+ ev2->size /* i size */);
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
=20
i_node3 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node3);
init_InstrInfo( i_node3,
- (Addr)cgs->events[i+2].iaddr, /* i addr *=
/
- cgs->events[i+2].size /* i size */);
+ (Addr)ev3->iaddr, /* i addr */
+ ev3->size /* i size */);
i_node3_expr =3D mkIRExpr_HWord( (HWord)i_node3 );
=20
argv =3D mkIRExprVec_3( i_node_expr, i_node2_expr, i_node=
3_expr );
@@ -666,15 +661,15 @@
}
/* Merge with a following Ir if possible. */
else
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].ekind =3D=3D Event_Ir) {
+ if (ev2 && ev2->ekind =3D=3D Event_Ir) {
helperName =3D "log_2I_0D_cache_access";
helperAddr =3D &log_2I_0D_cache_access;
+
i_node2 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node2);
init_InstrInfo( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
- cgs->events[i+1].size /* i size */);
+ (Addr)ev2->iaddr, /* i addr */
+ ev2->size /* i size */);
+
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
argv =3D mkIRExprVec_2( i_node_expr, i_node2_expr );
regparms =3D 2;
@@ -682,6 +677,10 @@
}
/* No merging possible; emit as-is. */
else {
+ // Assertion: this Event_Ir must be the last one in the
+ // events buffer, otherwise it would have been merged wit=
h a
+ // following event.
+ tl_assert(!ev2 && !ev3);
helperName =3D "log_1I_0D_cache_access";
helperAddr =3D &log_1I_0D_cache_access;
argv =3D mkIRExprVec_1( i_node_expr );
@@ -694,8 +693,8 @@
helperName =3D "log_0I_1Dr_cache_access";
helperAddr =3D &log_0I_1Dr_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,=20
- cgs->events[i].dataEA,=20
- mkIRExpr_HWord( cgs->events[i].size ) =
);
+ ev->dataEA,=20
+ mkIRExpr_HWord( ev->size ) );
regparms =3D 3;
i++;
break;
@@ -703,8 +702,8 @@
helperName =3D "log_0I_1Dw_cache_access";
helperAddr =3D &log_0I_1Dw_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i].dataEA,=20
- mkIRExpr_HWord( cgs->events[i].size ) =
);
+ ev->dataEA,=20
+ mkIRExpr_HWord( ev->size ) );
regparms =3D 3;
i++;
break;
|