Hi,
Could a gatekeeper please help review the fix for bug952(
http://bugs.open64.net/show_bug.cgi?id=952)?
Cut-down case please have a look at the attachment:
http://bugs.open64.net/attachment.cgi?id=511
opencc asserts:
### Assertion failure at line 6888 of
/fc/home/yug/open64/osprey/be/cg/x8664/expand.cxx:
### Compiler Error in file bug952.c during Code_Expansion phase:
### Exp_COPY: src or target TN pair missing
analysis:
The snippet to trigger the bug:
unsigned long long r10 = (n % divisor) * 10;
tenths = r10 / divisor;
...
tenths = r10/base;
in whirl format
...
U8U8LDID 78 <1,9,.preg_U8> T<9,.predef_U8,4> # __udivdi3.return
U4STID 72 <1,8,.preg_U4> T<4,.predef_I4,4> # tenths {line: 1/27}
....
U4U4LDID 64 <1,8,.preg_U4> T<8,.predef_U4,4> # <preg>
U4LOWPART
U4STID 72 <1,8,.preg_U4> T<4,.predef_I4,4> # tenths {line: 1/40}
preg 72 is expanded to pair (TN179,TN180), so U4STID 72 does require pair
TN copy, while TN189(the source) does not have the pair TN, which cause
the assertion.
Solution:
make preg72 be holded by a non-pair TN, so
U8INTRINSIC_OP 2 <792,UDIVDI3> 0
U4STID 72 <1,8,.preg_U4> T<4,.predef_I4,4> # tenths {line: 1/27}
do only single (non-paired) expand copy if there is U4STID in -m32 , even
the source in U8*** form.
patch below:
index 38ef367..d698937 100644
--- a/osprey/be/cg/whirl2ops.cxx
+++ b/osprey/be/cg/whirl2ops.cxx
@@ -1943,8 +1943,13 @@ Find_PREG_For_Symbol (const ST *st)
extern void Expand_Copy_Extension (TN *result, TN *src, TYPE_ID mtype,
BOOL signed_extension, OPS *ops);
#endif
+#ifdef TARG_X8664
+TN *
+Handle_LDID (WN* ldid, WN* parent, TN * result, OPCODE opcode)
+#else
TN *
Handle_LDID (WN *ldid, TN *result, OPCODE opcode)
+#endif
{
if (ST_assigned_to_dedicated_preg(WN_st(ldid))) {
// replace st with dedicated preg
@@ -2026,7 +2031,14 @@ Handle_LDID (WN *ldid, TN *result, OPCODE opcode)
}
}
#elif defined(TARG_X8664)
- if( OP_NEED_PAIR( ST_mtype(WN_st(ldid) ) ) ){
+ if( OP_NEED_PAIR( ST_mtype(WN_st(ldid))) &&
+ // open64.net bug952
+ // For m32, dont' copy TN pair for I8I8LDID for the case
+ // U8U8LDID
+ // U4STID xx <preg>
+ !(parent != NULL &&
+ (WN_opcode(parent) == OPC_U4STID ||
+ WN_opcode(parent) == OPC_I4STID))) {
Expand_Copy( result, ldid_result, ST_mtype(WN_st(ldid)), &New_OPs
);
} else {
Exp_COPY (result, ldid_result, &New_OPs);
@@ -4966,8 +4978,11 @@ Expand_Expr (WN *expr, WN *parent, TN *result)
switch (opr) {
case OPR_LDID:
+#ifdef TARG_X8664
+ return Handle_LDID (expr, parent, result, opcode);
+#else
return Handle_LDID (expr, result, opcode);
-
+#endif
case OPR_LDBITS:
return Handle_LDBITS (expr, result, opcode);
TIA for review.
Regards
Gang
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel