Boost logo

Boost Users :

From: Eric Fowler (eric.fowler_at_[hidden])
Date: 2006-09-10 00:17:13


I have a fraction of code using BGL that the MS compiler has for some reason
optimized into oblivion. While this is not a boost problem per se, since it
appears in a compiler I have not had problems with, I suspect all those
templates are confusing the MS compiler somehow.

The symptom is that when I get a property of an edge, then test on that
property and branch, the test is removed from the compiled assembly.

Here is the code:
//header
typedef property<edge_weight_t, unsigned>
EdgeCountProperty;
typedef adjacency_list<vecS, vecS, bidirectionalS, no_property,
EdgeCountProperty> Graph;
typedef graph_traits<Graph>::out_edge_iterator
OutEdgeIter;

.....
//code
    property_map<Graph, edge_weight_t>::type wgt = get(edge_weight, g);
    OutEdgeIter ei, ee, eMax;
    unsigned nTopWgt = 0;
    unsigned nChk = 0;
    for(tie(ei, ee) = out_edges(v, g), eMax = ee; ei != ee; ++ei)
    {
        nChk = wgt[*ei];

////////This 'if' is skipped, the code acts like nChk > nTopWgt is always
TRUE, even when it ain't!!
        if(nChk > nTopWgt);
        {
            nTopWgt = nChk;
            eMax = ei;
        }
    }

Here is the assembly:
    OutEdgeIter ei, ee, eMax;
00420514 lea ecx,[ei]
00420517 call
boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum boost::e
0042051C lea ecx,[ee]
0042051F call
boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum boost::e
00420524 lea ecx,[eMax]
00420527 call
boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum boost::e
    unsigned nTopWgt = 0;
0042052C mov dword ptr [nTopWgt],0
    unsigned nChk = 0;
00420533 mov dword ptr [nChk],0
    for(tie(ei, ee) = out_edges(v, g), eMax = ee; ei != ee; ++ei)
0042053A mov eax,dword ptr [g]
0042053D push eax
0042053E mov ecx,dword ptr [v]
00420541 mov edx,dword ptr [ecx]
00420543 push edx
00420544 lea eax,[ebp-198h]
0042054A push eax
0042054B call @ILT+5420(??$out_edges_at_Uconfig@?$adj_list_gen@
V?$adjacency_list_at_UvecS@boost@@U12_at_UbidirectionalS@2_at_Uno_property_at_2@U
?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2@@2_at_U42@UlistS_at_2@@boost@@
UvecS_at_2@U32_at_UbidirectionalS@2_at_Uno_property_at_2@U?$property@
W4edge_weight_t_at_boost@@IUno_property_at_2@@2_at_U52@UlistS_at_2@@detail_at_boost@@
U?$bidirectional_graph_helper_with_property_at_Uconfig@?$adj_list_gen@
V?$adjacency_list_at_UvecS@boost@@U12_at_UbidirectionalS@2_at_Uno_property_at_2@U
?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2@@2_at_U42@UlistS_at_2@@boost@@
UvecS_at_2@U32_at_UbidirectionalS@2_at_Uno_property_at_2@U?$property@
W4edge_weight_t_at_boost@@IUno_property_at_2@@2_at_U52@UlistS_at_2@@detail_at_boost
@@@4@@boost@@YA?AU?$pair_at_U?$out_edge_iter_at_Viterator@?$vector@
V?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@detail_at_boost@@V?$allocator@
00420550 add esp,0Ch
00420553 push eax
00420554 lea ecx,[ee]
00420557 push ecx
00420558 lea edx,[ei]
0042055B push edx
0042055C lea eax,[ebp-1A8h]
00420562 push eax
00420563 call @ILT+4705(??$tie_at_U?$out_edge_iter_at_Viterator@?$vector@
V?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@detail_at_boost@@V?$allocator_at_V
?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@detail_at_boost@@@std@@@std@@
IV?$edge_desc_impl_at_Ubidirectional_tag_at_boost@@I_at_detail@boost@@H_at_detail
@boost@@U123@@tuples_at_boost@@YA?AV?$tuple_at_AAU
?$out_edge_iter_at_Viterator@?$vector_at_V?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU
?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2@@boost@@@boost@@
V?$allocator_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@@std@@@std@
00420568 add esp,0Ch
0042056B mov ecx,eax
0042056D call @ILT+2355(??$?4U?$out_edge_iter_at_Viterator@?$vector@
V?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@detail_at_boost@@V?$allocator_at_V
?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@detail_at_boost@@@std@@@std@@
IV?$edge_desc_impl_at_Ubidirectional_tag_at_boost@@I_at_detail@boost@@H_at_detail
@boost@@U012@@?$tuple_at_AAU?$out_edge_iter_at_Viterator@?$vector@
V?$sei__at_IViterator@?$list_at_U?$list_edge_at_IU?$property_at_W4edge_weight_t_at_boost@@
IUno_property_at_2@@boost@@@boost@@V?$allocator_at_U?$list_edge@
IU?$property_at_W4edge_weight_t_at_boost@@IUno_property_at_2
@@boost@@@boost@@@std@@@std@@U?$property_at_W4edge_w
00420572 mov ecx,dword ptr [ee]
00420575 mov dword ptr [eMax],ecx
00420578 mov edx,dword ptr [ebp-24h]
0042057B mov dword ptr [ebp-34h],edx
0042057E jmp foo+0B8h (420588h)
00420580 lea ecx,[ei]
00420583 call
boost::iterator_facade<boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,boost::random_access_traversal_tag,bo
00420588 lea eax,[ee]
0042058B push eax
0042058C lea ecx,[ei]
0042058F push ecx
00420590 call
boost::operator!=<boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,boost::random_access_traversal_tag,boost::
00420595 add esp,8
00420598 movzx edx,al
0042059B test edx,edx
0042059D je foo+114h (4205E4h)
    {
        nChk = wgt[*ei];
0042059F lea eax,[ebp-180h]
004205A5 push eax
004205A6 lea ecx,[ei]
004205A9 call
boost::iterator_facade<boost::detail::out_edge_iter<std::vector<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> >,std::allocator<boost::detail::sei_<unsigned
int,std::list<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>
>,std::allocator<boost::list_edge<unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property> > >
>::iterator,boost::property<enum boost::edge_weight_t,unsigned
int,boost::no_property> > > >::iterator,unsigned
int,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,int>,boost::detail::edge_desc_impl<boost::bidirectional_tag,unsigned
int>,boost::random_access_traversal_tag,bo
004205AE sub esp,0Ch
004205B1 mov ecx,esp
004205B3 mov edx,dword ptr [eax]
004205B5 mov dword ptr [ecx],edx
004205B7 mov edx,dword ptr [eax+4]
004205BA mov dword ptr [ecx+4],edx
004205BD mov eax,dword ptr [eax+8]
004205C0 mov dword ptr [ecx+8],eax
004205C3 lea ecx,[wgt]
004205C6 call
boost::adj_list_edge_property_map<boost::bidirectional_tag,unsigned
int,unsigned int &,unsigned int,boost::property<enum
boost::edge_weight_t,unsigned int,boost::no_property>,enum
boost::edge_weight_t>::operator[] (41E2E3h)

;;LOOK MA! NO 'cmp' INSTRUCTION! WHERE'D IT GO?!!?
004205CB mov ecx,dword ptr [eax]
004205CD mov dword ptr [nChk],ecx
        if(nChk > nTopWgt);
        {
            nTopWgt = nChk;
004205D0 mov eax,dword ptr [nChk]
004205D3 mov dword ptr [nTopWgt],eax
            eMax = ei;
004205D6 mov eax,dword ptr [ei]
004205D9 mov dword ptr [eMax],eax
004205DC mov ecx,dword ptr [ebp-14h]
004205DF mov dword ptr [ebp-34h],ecx
        }
    }

I repeat that this is not a boost issue per se but this bug might show up
more often when compiling all those templates ...

Eric



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net