comparison src/share/vm/opto/stringopts.cpp @ 2383:9dc311b8473e

7008866: Missing loop predicate for loop with multiple entries Summary: Add predicates when loop head bytecode is parsed instead of when back branch bytecode is parsed. Reviewed-by: never
author kvn
date Mon, 21 Mar 2011 11:28:14 -0700
parents 2ddb2fab82cb
children 0e3ed5a14f73
comparison
equal deleted inserted replaced
2382:3ef1a1866a60 2383:9dc311b8473e
967 C->record_for_igvn(size); 967 C->record_for_igvn(size);
968 968
969 // for (int i=0; ; i++) 969 // for (int i=0; ; i++)
970 // if (x <= sizeTable[i]) 970 // if (x <= sizeTable[i])
971 // return i+1; 971 // return i+1;
972
973 // Add loop predicate first.
974 kit.add_predicate();
975
972 RegionNode *loop = new (C, 3) RegionNode(3); 976 RegionNode *loop = new (C, 3) RegionNode(3);
973 loop->init_req(1, kit.control()); 977 loop->init_req(1, kit.control());
974 kit.gvn().set_type(loop, Type::CONTROL); 978 kit.gvn().set_type(loop, Type::CONTROL);
975 979
976 Node *index = new (C, 3) PhiNode(loop, TypeInt::INT); 980 Node *index = new (C, 3) PhiNode(loop, TypeInt::INT);
1084 // i = q; 1088 // i = q;
1085 // if (i == 0) break; 1089 // if (i == 0) break;
1086 // } 1090 // }
1087 1091
1088 { 1092 {
1093 // Add loop predicate first.
1094 kit.add_predicate();
1095
1089 RegionNode *head = new (C, 3) RegionNode(3); 1096 RegionNode *head = new (C, 3) RegionNode(3);
1090 head->init_req(1, kit.control()); 1097 head->init_req(1, kit.control());
1091 kit.gvn().set_type(head, Type::CONTROL); 1098 kit.gvn().set_type(head, Type::CONTROL);
1092 Node *i_phi = new (C, 3) PhiNode(head, TypeInt::INT); 1099 Node *i_phi = new (C, 3) PhiNode(head, TypeInt::INT);
1093 i_phi->init_req(1, i); 1100 i_phi->init_req(1, i);