Mercurial > hg > graal-compiler
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); |