Author: yug
Date: 2011-11-19 09:46:56 -0500 (Sat, 19 Nov 2011)
New Revision: 3817
Modified:
trunk/osprey/be/cg/x8664/cgtarget.cxx
trunk/osprey/be/com/be_symtab.cxx
trunk/osprey/be/com/be_symtab.h
trunk/osprey/be/com/wn_lower.cxx
Log:
fix bug916. asm constraint 'i' wrong assertion
enable pattern like 'i'(p&v). Also introduce the TARG_NVISA code lda
for class BE_PREG, solve preg can't get lda expression issue like below:
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;
}
code review: Lai Jian-Xin.
Modified: trunk/osprey/be/cg/x8664/cgtarget.cxx
===================================================================
--- trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-11-19 14:27:08 UTC (rev
3816)
+++ trunk/osprey/be/cg/x8664/cgtarget.cxx 2011-11-19 14:46:56 UTC (rev
3817)
@@ -106,6 +106,8 @@
#include "cg_loop.h"
#include "config_lno.h" // for LNO_Prefetch_Ahead
#include "erbe.h"
+#include "stblock.h" //for Base_Symbol_And_Offset_For_Addressing
+#include "be_symtab.h" //Preg_Lda
UINT32 CGTARG_branch_taken_penalty;
BOOL CGTARG_branch_taken_penalty_overridden = FALSE;
@@ -3407,7 +3409,7 @@
: (C) == 'L' ? (VALUE) == 0xff || (VALUE) == 0xffff \
: (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 \
: (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 \
- : (C) == 'i' ? ((VALUE) >> 32) == 0 || ((VALUE) >> 32) == -1 \
+ : (C) == 'i' ? 1 \
: (C) == 'n' ? 1 \
: 0)
@@ -3493,11 +3495,22 @@
if (load && WN_operator(load)==OPR_LDID && WN_class(load)==CLASS_PREG)
{
// immediate could have been put in preg by wopt
- load = Preg_Is_Rematerializable(WN_load_offset(load), NULL);
+ if (Preg_Is_Rematerializable(WN_load_offset(load), NULL)) {
+ load = Preg_Is_Rematerializable(WN_load_offset(load), NULL);
+ }
+ // shared load(lda) has been lifted to preg
+ else if (Preg_Lda(WN_load_offset(load))) {
+ load = Preg_Lda(WN_load_offset(load));
+ }
+ else {
+ load = NULL;
+ }
}
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))))) {
ErrMsgSrcpos(EC_Invalid_Asm_Constrain, WN_Get_Linenum(asm_wn),
": Cannot find immediate operand for ASM");
}
@@ -3510,7 +3523,19 @@
ErrMsgSrcpos(EC_Invalid_Asm_Constrain, WN_Get_Linenum(asm_wn),
": The value of immediate operand supplied is not within
expected range.");
}
+ if (Is_Target_32bit() && (WN_const_val(load) > INT32_MAX ||
WN_const_val(load) < INT32_MIN)) {
+ char c[200];
+ sprintf(c,"%lld", WN_const_val(load));
+ ErrMsgSrcpos(EC_Ill_Int_Oflow, WN_Get_Linenum(asm_wn),
+ INT32_MIN,c,INT32_MAX);
+ }
}
+ 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);
+ }
else
{
// Bug 14390: string constant with an immediate constraint
Modified: trunk/osprey/be/com/be_symtab.cxx
===================================================================
--- trunk/osprey/be/com/be_symtab.cxx 2011-11-19 14:27:08 UTC (rev 3816)
+++ trunk/osprey/be/com/be_symtab.cxx 2011-11-19 14:46:56 UTC (rev 3817)
@@ -327,7 +327,7 @@
}
-#ifdef TARG_NVISA
+
// Search tree for a LDA, returning NULL if not found.
// Will search through preg homes to find LDA.
// Can also return LDID if is LDID of parameter pointer.
@@ -348,6 +348,7 @@
if (lda) return lda;
return Find_Lda (Preg_Home(WN_offset(tree)));
}
+#ifdef TARG_NVISA
else if (ST_sclass(WN_st(tree)) == SCLASS_FORMAL
&& ST_in_shared_mem(WN_st(tree)))
{
@@ -382,6 +383,7 @@
return tree;
}
}
+#endif
return NULL;
case OPR_ADD:
case OPR_SUB:
@@ -400,4 +402,4 @@
return NULL;
}
}
-#endif
+
Modified: trunk/osprey/be/com/be_symtab.h
===================================================================
--- trunk/osprey/be/com/be_symtab.h 2011-11-19 14:27:08 UTC (rev 3816)
+++ trunk/osprey/be/com/be_symtab.h 2011-11-19 14:46:56 UTC (rev 3817)
@@ -504,21 +504,13 @@
class BE_PREG {
private:
WN *home_location;
-#ifdef TARG_NVISA
WN *lda;
-#endif
public:
-#ifdef TARG_NVISA
BE_PREG(void) : home_location(NULL), lda(NULL) { }
-#else
- BE_PREG(void) : home_location(NULL) { }
-#endif
void Set_home_location(WN *wn) { home_location = wn; }
WN *Home_location(void) const { return home_location; }
-#ifdef TARG_NVISA
void Set_lda(WN *wn) { lda = wn; }
WN *Lda(void) const { return lda; }
-#endif
};
typedef RELATED_SEGMENTED_ARRAY<BE_PREG> BE_PREG_TAB;
@@ -543,7 +535,7 @@
return (idx < Be_preg_tab.Size()) ? Be_preg_tab[idx].Home_location() : NULL;
}
-#ifdef TARG_NVISA
+
static inline WN*
Preg_Lda(PREG_NUM preg)
{
@@ -561,8 +553,8 @@
// Will search through preg homes to find LDA.
// Can also return LDID if is LDID of parameter pointer.
extern WN* Find_Lda (WN *tree);
-#endif
+
extern void BE_symtab_initialize_be_scopes(void);
extern void BE_symtab_free_be_scopes(void);
extern void BE_symtab_alloc_scope_level(SYMTAB_IDX);
Modified: trunk/osprey/be/com/wn_lower.cxx
===================================================================
--- trunk/osprey/be/com/wn_lower.cxx 2011-11-19 14:27:08 UTC (rev 3816)
+++ trunk/osprey/be/com/wn_lower.cxx 2011-11-19 14:46:56 UTC (rev 3817)
@@ -1439,14 +1439,14 @@
type = TY_mtype(Ty_Table[ty]);
pregNo = Create_Preg(type, current_preg_name);
-#ifdef TARG_NVISA
+
// we need to track what memory is being accessed when storing
// an lda into a preg. So if tree has an lda, or indirects to lda
// through another preg, put that in preg table.
WN *lda = Find_Lda (tree);
if (lda) Set_Preg_Lda (pregNo, lda);
-#endif
+
{
WN *stBlock, *stid;
@@ -8041,7 +8041,6 @@
}
}
-#ifdef TARG_NVISA
if ( Action (LOWER_TO_CG)
&& (WN_class(tree) == CLASS_PREG)
&& (! Preg_Is_Dedicated (WN_store_offset (tree))))
@@ -8051,8 +8050,8 @@
WN *lda = Find_Lda (WN_kid0(tree));
if (lda) Set_Preg_Lda (WN_store_offset(tree), lda);
}
-#endif
+
if (WN_StoreIsUnused(tree))
{
WN *eval;
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel