The patch looks good to me except some format issues: - for the new code, a space is needed after the comma.
2011/11/16 Gang Yu <yugang...@gmail.com>: > Hi, > > Could a gatekeeper please help review the following patch for bug916 > http://bugs.open64.net/show_bug.cgi?id=916? > > Symptom: > opencc does not accept the asm constraint like , "i"(&p.v), while gcc > does. > > struct T { > int u; > int v; > } t; > int main(void) > { > void * ret__; > asm volatile ("mov ""%P" "1"",%0" : "=r" (ret__) : "i" (&t.v)); > return 0; > } > > hunks below resolve this: > @@ -3493,11 +3495,22 @@ CGTARG_TN_For_Asm_Operand (const char* constraint, > if (!(load && (WN_operator(load) == OPR_INTCONST || > (WN_operator(load) == OPR_LDA && > - ST_sym_class(WN_st(load)) == CLASS_CONST)))) { > + // &var.field is also allowed, bug916 open64.net > + (ST_sym_class(WN_st(load)) == CLASS_VAR || > + ST_sym_class(WN_st(load)) == CLASS_CONST))))) { > > + else if (ST_sym_class(WN_st(load)) == CLASS_VAR) { > + ST *base; > + INT64 ofst; > + Base_Symbol_And_Offset_For_Addressing (WN_st(load), > WN_lda_offset(load), &base, &ofst); > + ret_tn = Gen_Symbol_TN(base,ofst,0); > > &t.v can only be instantiated to a symbol TN. > > However, it is not done. Interesting part comes. The bug 916-2.c still fails > at O2 or above, > > struct u{ > int a; > void (*f)(void); > } p; > int main(void) > { > void * ret__; > asm volatile ("mov %" "1"",%0" : "=r" (ret__) : "i" (&(p.f))); > asm volatile ("mov %" "1"",%0" : "=r" (ret__) : "i" (&(p.f))); > return 0; > } > > this is because the common sub-expression &p.f is lifted up to a preg by > wopt and the preg is not rematerializable to a Home WN. so > 3493 if (load && WN_operator(load)==OPR_LDID && > WN_class(load)==CLASS_PREG) > 3494 { > 3495 // immediate could have been put in preg by wopt > 3496 load = Preg_Is_Rematerializable(WN_load_offset(load), NULL); > 3497 } > > make load a null value, which then asserts. > > We can't get the associated WN for a preg TN easily. Luckily, TARG_NVISA > already provide a solution although it is enclosed by TARG_NVISA. > > in be_symtab.h: > > 504class BE_PREG { > 505private: > 506 WN *home_location; > 507#ifdef TARG_NVISA > 508 WN *lda; > 509#endif > 510public: > 511#ifdef TARG_NVISA > 512 BE_PREG(void) : home_location(NULL), lda(NULL) { } > 513#else > 514 BE_PREG(void) : home_location(NULL) { } > 515#endif > 516 void Set_home_location(WN *wn) { home_location = wn; } > 517 WN *Home_location(void) const { return home_location; } > 518#ifdef TARG_NVISA > 519 void Set_lda(WN *wn) { lda = wn; } > 520 WN *Lda(void) const { return lda; } > 521#endif > > we see TARG_NVISA already provide such facility, next we disclose these > parts and filter out those still belongs TARG_NVISA only(i.e, in Find_Lda > and ST_in_share_mem and ST_in_const_mem) , we get things done. > > The extra computation is Find_Lda when lowing a preg expression, this does > not introduce much expense. > > Test and Valiadation: > > please find cases bug916 to bug916-7 at the open64 regression site > > Merged with previous constraint_p patch, we build the kernel with no > constrain assertion thrown out. > > The whole patch is attached > > Would a gatekeeper help a review? thanks very much. > > > Regards > Gang > > ------------------------------------------------------------------------------ > RSA(R) Conference 2012 > Save $700 by Nov 18 > Register now > http://p.sf.net/sfu/rsa-sfdev2dev1 > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > > -- Regards, Lai Jian-Xin ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-novd2d _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel