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

Reply via email to