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
bug916.patch
Description: Binary data
------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________ Open64-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/open64-devel
