Mercurial > hg > truffle
comparison src/share/vm/opto/connode.cpp @ 36:f34d9da7acb2
6667618: disable LoadL->ConvL2I ==> LoadI optimization
Summary: this optimization causes problems (sizes of Load and Store nodes do not match) for objects initialization code and Escape Analysis
Reviewed-by: jrose, never
author | kvn |
---|---|
date | Fri, 29 Feb 2008 19:57:41 -0800 |
parents | a61af66fc99e |
children | ba764ed4b6f2 |
comparison
equal
deleted
inserted
replaced
35:e2ae28d2ce91 | 36:f34d9da7acb2 |
---|---|
980 Node *add1 = phase->transform(new (phase->C, 2) ConvL2INode(x)); | 980 Node *add1 = phase->transform(new (phase->C, 2) ConvL2INode(x)); |
981 Node *add2 = phase->transform(new (phase->C, 2) ConvL2INode(y)); | 981 Node *add2 = phase->transform(new (phase->C, 2) ConvL2INode(y)); |
982 return new (phase->C, 3) AddINode(add1,add2); | 982 return new (phase->C, 3) AddINode(add1,add2); |
983 } | 983 } |
984 | 984 |
985 // Fold up with a prior LoadL: LoadL->ConvL2I ==> LoadI | 985 // Disable optimization: LoadL->ConvL2I ==> LoadI. |
986 // Requires we understand the 'endianess' of Longs. | 986 // It causes problems (sizes of Load and Store nodes do not match) |
987 if( andl_op == Op_LoadL ) { | 987 // in objects initialization code and Escape Analysis. |
988 Node *adr = andl->in(MemNode::Address); | |
989 // VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles | |
990 #ifndef VM_LITTLE_ENDIAN | |
991 // The transformation can cause problems on BIG_ENDIAN architectures | |
992 // where the jint is not the same address as the jlong. Specifically, we | |
993 // will fail to insert an anti-dependence in GCM between the LoadI and a | |
994 // subsequent StoreL because different memory offsets provoke | |
995 // flatten_alias_type() into indicating two different types. See bug | |
996 // 4755222. | |
997 | |
998 // Node *base = adr->is_AddP() ? adr->in(AddPNode::Base) : adr; | |
999 // adr = phase->transform( new (phase->C, 4) AddPNode(base,adr,phase->MakeConX(sizeof(jint)))); | |
1000 return NULL; | |
1001 #else | |
1002 if (phase->C->alias_type(andl->adr_type())->is_volatile()) { | |
1003 // Picking up the low half by itself bypasses the atomic load and we could | |
1004 // end up with more than one non-atomic load. See bugs 4432655 and 4526490. | |
1005 // We could go to the trouble of iterating over andl's output edges and | |
1006 // punting only if there's more than one real use, but we don't bother. | |
1007 return NULL; | |
1008 } | |
1009 return new (phase->C, 3) LoadINode(andl->in(MemNode::Control),andl->in(MemNode::Memory),adr,((LoadLNode*)andl)->raw_adr_type()); | |
1010 #endif | |
1011 } | |
1012 | |
1013 return NULL; | 988 return NULL; |
1014 } | 989 } |
1015 | 990 |
1016 //============================================================================= | 991 //============================================================================= |
1017 //------------------------------Value------------------------------------------ | 992 //------------------------------Value------------------------------------------ |