comparison src/share/vm/opto/loopTransform.cpp @ 8701:b95ad0610fef

Merge
author asaha
date Fri, 26 Oct 2012 09:27:25 -0700
parents 521c82b9cbf8 d804e148cff8
children b5cb079ecaa4
comparison
equal deleted inserted replaced
6908:5a3a6dac85e2 8701:b95ad0610fef
1 /* 1 /*
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
90 Node* limit_n = cl->limit(); 90 Node* limit_n = cl->limit();
91 if (init_n != NULL && init_n->is_Con() && 91 if (init_n != NULL && init_n->is_Con() &&
92 limit_n != NULL && limit_n->is_Con()) { 92 limit_n != NULL && limit_n->is_Con()) {
93 // Use longs to avoid integer overflow. 93 // Use longs to avoid integer overflow.
94 int stride_con = cl->stride_con(); 94 int stride_con = cl->stride_con();
95 long init_con = cl->init_trip()->get_int(); 95 jlong init_con = cl->init_trip()->get_int();
96 long limit_con = cl->limit()->get_int(); 96 jlong limit_con = cl->limit()->get_int();
97 int stride_m = stride_con - (stride_con > 0 ? 1 : -1); 97 int stride_m = stride_con - (stride_con > 0 ? 1 : -1);
98 long trip_count = (limit_con - init_con + stride_m)/stride_con; 98 jlong trip_count = (limit_con - init_con + stride_m)/stride_con;
99 if (trip_count > 0 && (julong)trip_count < (julong)max_juint) { 99 if (trip_count > 0 && (julong)trip_count < (julong)max_juint) {
100 // Set exact trip count. 100 // Set exact trip count.
101 cl->set_exact_trip_count((uint)trip_count); 101 cl->set_exact_trip_count((uint)trip_count);
102 } 102 }
103 } 103 }
222 Node* inv2_c = phase->get_ctrl(inv2); 222 Node* inv2_c = phase->get_ctrl(inv2);
223 Node* n_inv1; 223 Node* n_inv1;
224 if (neg_inv1) { 224 if (neg_inv1) {
225 Node *zero = phase->_igvn.intcon(0); 225 Node *zero = phase->_igvn.intcon(0);
226 phase->set_ctrl(zero, phase->C->root()); 226 phase->set_ctrl(zero, phase->C->root());
227 n_inv1 = new (phase->C, 3) SubINode(zero, inv1); 227 n_inv1 = new (phase->C) SubINode(zero, inv1);
228 phase->register_new_node(n_inv1, inv1_c); 228 phase->register_new_node(n_inv1, inv1_c);
229 } else { 229 } else {
230 n_inv1 = inv1; 230 n_inv1 = inv1;
231 } 231 }
232 Node* inv; 232 Node* inv;
233 if (neg_inv2) { 233 if (neg_inv2) {
234 inv = new (phase->C, 3) SubINode(n_inv1, inv2); 234 inv = new (phase->C) SubINode(n_inv1, inv2);
235 } else { 235 } else {
236 inv = new (phase->C, 3) AddINode(n_inv1, inv2); 236 inv = new (phase->C) AddINode(n_inv1, inv2);
237 } 237 }
238 phase->register_new_node(inv, phase->get_early_ctrl(inv)); 238 phase->register_new_node(inv, phase->get_early_ctrl(inv));
239 239
240 Node* addx; 240 Node* addx;
241 if (neg_x) { 241 if (neg_x) {
242 addx = new (phase->C, 3) SubINode(inv, x); 242 addx = new (phase->C) SubINode(inv, x);
243 } else { 243 } else {
244 addx = new (phase->C, 3) AddINode(x, inv); 244 addx = new (phase->C) AddINode(x, inv);
245 } 245 }
246 phase->register_new_node(addx, phase->get_ctrl(x)); 246 phase->register_new_node(addx, phase->get_ctrl(x));
247 phase->_igvn.replace_node(n1, addx); 247 phase->_igvn.replace_node(n1, addx);
248 assert(phase->get_loop(phase->get_ctrl(n1)) == this, ""); 248 assert(phase->get_loop(phase->get_ctrl(n1)) == this, "");
249 _body.yank(n1); 249 _body.yank(n1);
930 // Reduce the post-loop trip count. 930 // Reduce the post-loop trip count.
931 CountedLoopEndNode* post_end = old_new[main_end ->_idx]->as_CountedLoopEnd(); 931 CountedLoopEndNode* post_end = old_new[main_end ->_idx]->as_CountedLoopEnd();
932 post_end->_prob = PROB_FAIR; 932 post_end->_prob = PROB_FAIR;
933 933
934 // Build the main-loop normal exit. 934 // Build the main-loop normal exit.
935 IfFalseNode *new_main_exit = new (C, 1) IfFalseNode(main_end); 935 IfFalseNode *new_main_exit = new (C) IfFalseNode(main_end);
936 _igvn.register_new_node_with_optimizer( new_main_exit ); 936 _igvn.register_new_node_with_optimizer( new_main_exit );
937 set_idom(new_main_exit, main_end, dd_main_exit ); 937 set_idom(new_main_exit, main_end, dd_main_exit );
938 set_loop(new_main_exit, loop->_parent); 938 set_loop(new_main_exit, loop->_parent);
939 939
940 // Step A2: Build a zero-trip guard for the post-loop. After leaving the 940 // Step A2: Build a zero-trip guard for the post-loop. After leaving the
941 // main-loop, the post-loop may not execute at all. We 'opaque' the incr 941 // main-loop, the post-loop may not execute at all. We 'opaque' the incr
942 // (the main-loop trip-counter exit value) because we will be changing 942 // (the main-loop trip-counter exit value) because we will be changing
943 // the exit value (via unrolling) so we cannot constant-fold away the zero 943 // the exit value (via unrolling) so we cannot constant-fold away the zero
944 // trip guard until all unrolling is done. 944 // trip guard until all unrolling is done.
945 Node *zer_opaq = new (C, 2) Opaque1Node(C, incr); 945 Node *zer_opaq = new (C) Opaque1Node(C, incr);
946 Node *zer_cmp = new (C, 3) CmpINode( zer_opaq, limit ); 946 Node *zer_cmp = new (C) CmpINode( zer_opaq, limit );
947 Node *zer_bol = new (C, 2) BoolNode( zer_cmp, b_test ); 947 Node *zer_bol = new (C) BoolNode( zer_cmp, b_test );
948 register_new_node( zer_opaq, new_main_exit ); 948 register_new_node( zer_opaq, new_main_exit );
949 register_new_node( zer_cmp , new_main_exit ); 949 register_new_node( zer_cmp , new_main_exit );
950 register_new_node( zer_bol , new_main_exit ); 950 register_new_node( zer_bol , new_main_exit );
951 951
952 // Build the IfNode 952 // Build the IfNode
953 IfNode *zer_iff = new (C, 2) IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN ); 953 IfNode *zer_iff = new (C) IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN );
954 _igvn.register_new_node_with_optimizer( zer_iff ); 954 _igvn.register_new_node_with_optimizer( zer_iff );
955 set_idom(zer_iff, new_main_exit, dd_main_exit); 955 set_idom(zer_iff, new_main_exit, dd_main_exit);
956 set_loop(zer_iff, loop->_parent); 956 set_loop(zer_iff, loop->_parent);
957 957
958 // Plug in the false-path, taken if we need to skip post-loop 958 // Plug in the false-path, taken if we need to skip post-loop
959 _igvn.replace_input_of(main_exit, 0, zer_iff); 959 _igvn.replace_input_of(main_exit, 0, zer_iff);
960 set_idom(main_exit, zer_iff, dd_main_exit); 960 set_idom(main_exit, zer_iff, dd_main_exit);
961 set_idom(main_exit->unique_out(), zer_iff, dd_main_exit); 961 set_idom(main_exit->unique_out(), zer_iff, dd_main_exit);
962 // Make the true-path, must enter the post loop 962 // Make the true-path, must enter the post loop
963 Node *zer_taken = new (C, 1) IfTrueNode( zer_iff ); 963 Node *zer_taken = new (C) IfTrueNode( zer_iff );
964 _igvn.register_new_node_with_optimizer( zer_taken ); 964 _igvn.register_new_node_with_optimizer( zer_taken );
965 set_idom(zer_taken, zer_iff, dd_main_exit); 965 set_idom(zer_taken, zer_iff, dd_main_exit);
966 set_loop(zer_taken, loop->_parent); 966 set_loop(zer_taken, loop->_parent);
967 // Plug in the true path 967 // Plug in the true path
968 _igvn.hash_delete( post_head ); 968 _igvn.hash_delete( post_head );
1006 pre_end->_prob = PROB_FAIR; 1006 pre_end->_prob = PROB_FAIR;
1007 1007
1008 // Find the pre-loop normal exit. 1008 // Find the pre-loop normal exit.
1009 Node* pre_exit = pre_end->proj_out(false); 1009 Node* pre_exit = pre_end->proj_out(false);
1010 assert( pre_exit->Opcode() == Op_IfFalse, "" ); 1010 assert( pre_exit->Opcode() == Op_IfFalse, "" );
1011 IfFalseNode *new_pre_exit = new (C, 1) IfFalseNode(pre_end); 1011 IfFalseNode *new_pre_exit = new (C) IfFalseNode(pre_end);
1012 _igvn.register_new_node_with_optimizer( new_pre_exit ); 1012 _igvn.register_new_node_with_optimizer( new_pre_exit );
1013 set_idom(new_pre_exit, pre_end, dd_main_head); 1013 set_idom(new_pre_exit, pre_end, dd_main_head);
1014 set_loop(new_pre_exit, loop->_parent); 1014 set_loop(new_pre_exit, loop->_parent);
1015 1015
1016 // Step B2: Build a zero-trip guard for the main-loop. After leaving the 1016 // Step B2: Build a zero-trip guard for the main-loop. After leaving the
1017 // pre-loop, the main-loop may not execute at all. Later in life this 1017 // pre-loop, the main-loop may not execute at all. Later in life this
1018 // zero-trip guard will become the minimum-trip guard when we unroll 1018 // zero-trip guard will become the minimum-trip guard when we unroll
1019 // the main-loop. 1019 // the main-loop.
1020 Node *min_opaq = new (C, 2) Opaque1Node(C, limit); 1020 Node *min_opaq = new (C) Opaque1Node(C, limit);
1021 Node *min_cmp = new (C, 3) CmpINode( pre_incr, min_opaq ); 1021 Node *min_cmp = new (C) CmpINode( pre_incr, min_opaq );
1022 Node *min_bol = new (C, 2) BoolNode( min_cmp, b_test ); 1022 Node *min_bol = new (C) BoolNode( min_cmp, b_test );
1023 register_new_node( min_opaq, new_pre_exit ); 1023 register_new_node( min_opaq, new_pre_exit );
1024 register_new_node( min_cmp , new_pre_exit ); 1024 register_new_node( min_cmp , new_pre_exit );
1025 register_new_node( min_bol , new_pre_exit ); 1025 register_new_node( min_bol , new_pre_exit );
1026 1026
1027 // Build the IfNode (assume the main-loop is executed always). 1027 // Build the IfNode (assume the main-loop is executed always).
1028 IfNode *min_iff = new (C, 2) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN ); 1028 IfNode *min_iff = new (C) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
1029 _igvn.register_new_node_with_optimizer( min_iff ); 1029 _igvn.register_new_node_with_optimizer( min_iff );
1030 set_idom(min_iff, new_pre_exit, dd_main_head); 1030 set_idom(min_iff, new_pre_exit, dd_main_head);
1031 set_loop(min_iff, loop->_parent); 1031 set_loop(min_iff, loop->_parent);
1032 1032
1033 // Plug in the false-path, taken if we need to skip main-loop 1033 // Plug in the false-path, taken if we need to skip main-loop
1034 _igvn.hash_delete( pre_exit ); 1034 _igvn.hash_delete( pre_exit );
1035 pre_exit->set_req(0, min_iff); 1035 pre_exit->set_req(0, min_iff);
1036 set_idom(pre_exit, min_iff, dd_main_head); 1036 set_idom(pre_exit, min_iff, dd_main_head);
1037 set_idom(pre_exit->unique_out(), min_iff, dd_main_head); 1037 set_idom(pre_exit->unique_out(), min_iff, dd_main_head);
1038 // Make the true-path, must enter the main loop 1038 // Make the true-path, must enter the main loop
1039 Node *min_taken = new (C, 1) IfTrueNode( min_iff ); 1039 Node *min_taken = new (C) IfTrueNode( min_iff );
1040 _igvn.register_new_node_with_optimizer( min_taken ); 1040 _igvn.register_new_node_with_optimizer( min_taken );
1041 set_idom(min_taken, min_iff, dd_main_head); 1041 set_idom(min_taken, min_iff, dd_main_head);
1042 set_loop(min_taken, loop->_parent); 1042 set_loop(min_taken, loop->_parent);
1043 // Plug in the true path 1043 // Plug in the true path
1044 _igvn.hash_delete( main_head ); 1044 _igvn.hash_delete( main_head );
1064 1064
1065 // Step B4: Shorten the pre-loop to run only 1 iteration (for now). 1065 // Step B4: Shorten the pre-loop to run only 1 iteration (for now).
1066 // RCE and alignment may change this later. 1066 // RCE and alignment may change this later.
1067 Node *cmp_end = pre_end->cmp_node(); 1067 Node *cmp_end = pre_end->cmp_node();
1068 assert( cmp_end->in(2) == limit, "" ); 1068 assert( cmp_end->in(2) == limit, "" );
1069 Node *pre_limit = new (C, 3) AddINode( init, stride ); 1069 Node *pre_limit = new (C) AddINode( init, stride );
1070 1070
1071 // Save the original loop limit in this Opaque1 node for 1071 // Save the original loop limit in this Opaque1 node for
1072 // use by range check elimination. 1072 // use by range check elimination.
1073 Node *pre_opaq = new (C, 3) Opaque1Node(C, pre_limit, limit); 1073 Node *pre_opaq = new (C) Opaque1Node(C, pre_limit, limit);
1074 1074
1075 register_new_node( pre_limit, pre_head->in(0) ); 1075 register_new_node( pre_limit, pre_head->in(0) );
1076 register_new_node( pre_opaq , pre_head->in(0) ); 1076 register_new_node( pre_opaq , pre_head->in(0) );
1077 1077
1078 // Since no other users of pre-loop compare, I can hack limit directly 1078 // Since no other users of pre-loop compare, I can hack limit directly
1093 if (pre_end->in(CountedLoopEndNode::TestValue)->as_Bool()->_test._test == BoolTest::ne) { 1093 if (pre_end->in(CountedLoopEndNode::TestValue)->as_Bool()->_test._test == BoolTest::ne) {
1094 1094
1095 BoolTest::mask new_test = (main_end->stride_con() > 0) ? BoolTest::lt : BoolTest::gt; 1095 BoolTest::mask new_test = (main_end->stride_con() > 0) ? BoolTest::lt : BoolTest::gt;
1096 // Modify pre loop end condition 1096 // Modify pre loop end condition
1097 Node* pre_bol = pre_end->in(CountedLoopEndNode::TestValue)->as_Bool(); 1097 Node* pre_bol = pre_end->in(CountedLoopEndNode::TestValue)->as_Bool();
1098 BoolNode* new_bol0 = new (C, 2) BoolNode(pre_bol->in(1), new_test); 1098 BoolNode* new_bol0 = new (C) BoolNode(pre_bol->in(1), new_test);
1099 register_new_node( new_bol0, pre_head->in(0) ); 1099 register_new_node( new_bol0, pre_head->in(0) );
1100 _igvn.hash_delete(pre_end); 1100 _igvn.hash_delete(pre_end);
1101 pre_end->set_req(CountedLoopEndNode::TestValue, new_bol0); 1101 pre_end->set_req(CountedLoopEndNode::TestValue, new_bol0);
1102 // Modify main loop guard condition 1102 // Modify main loop guard condition
1103 assert(min_iff->in(CountedLoopEndNode::TestValue) == min_bol, "guard okay"); 1103 assert(min_iff->in(CountedLoopEndNode::TestValue) == min_bol, "guard okay");
1104 BoolNode* new_bol1 = new (C, 2) BoolNode(min_bol->in(1), new_test); 1104 BoolNode* new_bol1 = new (C) BoolNode(min_bol->in(1), new_test);
1105 register_new_node( new_bol1, new_pre_exit ); 1105 register_new_node( new_bol1, new_pre_exit );
1106 _igvn.hash_delete(min_iff); 1106 _igvn.hash_delete(min_iff);
1107 min_iff->set_req(CountedLoopEndNode::TestValue, new_bol1); 1107 min_iff->set_req(CountedLoopEndNode::TestValue, new_bol1);
1108 // Modify main loop end condition 1108 // Modify main loop end condition
1109 BoolNode* main_bol = main_end->in(CountedLoopEndNode::TestValue)->as_Bool(); 1109 BoolNode* main_bol = main_end->in(CountedLoopEndNode::TestValue)->as_Bool();
1110 BoolNode* new_bol2 = new (C, 2) BoolNode(main_bol->in(1), new_test); 1110 BoolNode* new_bol2 = new (C) BoolNode(main_bol->in(1), new_test);
1111 register_new_node( new_bol2, main_end->in(CountedLoopEndNode::TestControl) ); 1111 register_new_node( new_bol2, main_end->in(CountedLoopEndNode::TestControl) );
1112 _igvn.hash_delete(main_end); 1112 _igvn.hash_delete(main_end);
1113 main_end->set_req(CountedLoopEndNode::TestValue, new_bol2); 1113 main_end->set_req(CountedLoopEndNode::TestValue, new_bol2);
1114 } 1114 }
1115 1115
1210 "odd trip count for maximally unroll"); 1210 "odd trip count for maximally unroll");
1211 // Don't need to adjust limit for maximally unroll since trip count is even. 1211 // Don't need to adjust limit for maximally unroll since trip count is even.
1212 } else if (loop_head->has_exact_trip_count() && init->is_Con()) { 1212 } else if (loop_head->has_exact_trip_count() && init->is_Con()) {
1213 // Loop's limit is constant. Loop's init could be constant when pre-loop 1213 // Loop's limit is constant. Loop's init could be constant when pre-loop
1214 // become peeled iteration. 1214 // become peeled iteration.
1215 long init_con = init->get_int(); 1215 jlong init_con = init->get_int();
1216 // We can keep old loop limit if iterations count stays the same: 1216 // We can keep old loop limit if iterations count stays the same:
1217 // old_trip_count == new_trip_count * 2 1217 // old_trip_count == new_trip_count * 2
1218 // Note: since old_trip_count >= 2 then new_trip_count >= 1 1218 // Note: since old_trip_count >= 2 then new_trip_count >= 1
1219 // so we also don't need to adjust zero trip test. 1219 // so we also don't need to adjust zero trip test.
1220 long limit_con = limit->get_int(); 1220 jlong limit_con = limit->get_int();
1221 // (stride_con*2) not overflow since stride_con <= 8. 1221 // (stride_con*2) not overflow since stride_con <= 8.
1222 int new_stride_con = stride_con * 2; 1222 int new_stride_con = stride_con * 2;
1223 int stride_m = new_stride_con - (stride_con > 0 ? 1 : -1); 1223 int stride_m = new_stride_con - (stride_con > 0 ? 1 : -1);
1224 long trip_count = (limit_con - init_con + stride_m)/new_stride_con; 1224 jlong trip_count = (limit_con - init_con + stride_m)/new_stride_con;
1225 // New trip count should satisfy next conditions. 1225 // New trip count should satisfy next conditions.
1226 assert(trip_count > 0 && (julong)trip_count < (julong)max_juint/2, "sanity"); 1226 assert(trip_count > 0 && (julong)trip_count < (julong)max_juint/2, "sanity");
1227 uint new_trip_count = (uint)trip_count; 1227 uint new_trip_count = (uint)trip_count;
1228 adjust_min_trip = (old_trip_count != new_trip_count*2); 1228 adjust_min_trip = (old_trip_count != new_trip_count*2);
1229 } 1229 }
1255 // Otherwise reorg_offsets() optimization will create a separate 1255 // Otherwise reorg_offsets() optimization will create a separate
1256 // Opaque node for each use of trip-counter and as result 1256 // Opaque node for each use of trip-counter and as result
1257 // zero trip guard limit will be different from loop limit. 1257 // zero trip guard limit will be different from loop limit.
1258 assert(has_ctrl(opaq), "should have it"); 1258 assert(has_ctrl(opaq), "should have it");
1259 Node* opaq_ctrl = get_ctrl(opaq); 1259 Node* opaq_ctrl = get_ctrl(opaq);
1260 limit = new (C, 2) Opaque2Node( C, limit ); 1260 limit = new (C) Opaque2Node( C, limit );
1261 register_new_node( limit, opaq_ctrl ); 1261 register_new_node( limit, opaq_ctrl );
1262 } 1262 }
1263 if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) || 1263 if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) ||
1264 stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) { 1264 stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) {
1265 // No underflow. 1265 // No underflow.
1266 new_limit = new (C, 3) SubINode(limit, stride); 1266 new_limit = new (C) SubINode(limit, stride);
1267 } else { 1267 } else {
1268 // (limit - stride) may underflow. 1268 // (limit - stride) may underflow.
1269 // Clamp the adjustment value with MININT or MAXINT: 1269 // Clamp the adjustment value with MININT or MAXINT:
1270 // 1270 //
1271 // new_limit = limit-stride 1271 // new_limit = limit-stride
1291 // Optimize the limit to avoid nested CMove: 1291 // Optimize the limit to avoid nested CMove:
1292 // use original limit as old limit. 1292 // use original limit as old limit.
1293 old_limit = bol->in(1)->in(1); 1293 old_limit = bol->in(1)->in(1);
1294 // Adjust previous adjusted limit. 1294 // Adjust previous adjusted limit.
1295 adj_limit = limit->in(CMoveNode::IfFalse); 1295 adj_limit = limit->in(CMoveNode::IfFalse);
1296 adj_limit = new (C, 3) SubINode(adj_limit, stride); 1296 adj_limit = new (C) SubINode(adj_limit, stride);
1297 } else { 1297 } else {
1298 old_limit = limit; 1298 old_limit = limit;
1299 adj_limit = new (C, 3) SubINode(limit, stride); 1299 adj_limit = new (C) SubINode(limit, stride);
1300 } 1300 }
1301 assert(old_limit != NULL && adj_limit != NULL, ""); 1301 assert(old_limit != NULL && adj_limit != NULL, "");
1302 register_new_node( adj_limit, ctrl ); // adjust amount 1302 register_new_node( adj_limit, ctrl ); // adjust amount
1303 Node* adj_cmp = new (C, 3) CmpINode(old_limit, adj_limit); 1303 Node* adj_cmp = new (C) CmpINode(old_limit, adj_limit);
1304 register_new_node( adj_cmp, ctrl ); 1304 register_new_node( adj_cmp, ctrl );
1305 Node* adj_bool = new (C, 2) BoolNode(adj_cmp, bt); 1305 Node* adj_bool = new (C) BoolNode(adj_cmp, bt);
1306 register_new_node( adj_bool, ctrl ); 1306 register_new_node( adj_bool, ctrl );
1307 new_limit = new (C, 4) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT); 1307 new_limit = new (C) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT);
1308 } 1308 }
1309 register_new_node(new_limit, ctrl); 1309 register_new_node(new_limit, ctrl);
1310 } 1310 }
1311 assert(new_limit != NULL, ""); 1311 assert(new_limit != NULL, "");
1312 // Replace in loop test. 1312 // Replace in loop test.
1364 // Step 2: Cut back the trip counter for an unroll amount of 2. 1364 // Step 2: Cut back the trip counter for an unroll amount of 2.
1365 // Loop will normally trip (limit - init)/stride_con. Since it's a 1365 // Loop will normally trip (limit - init)/stride_con. Since it's a
1366 // CountedLoop this is exact (stride divides limit-init exactly). 1366 // CountedLoop this is exact (stride divides limit-init exactly).
1367 // We are going to double the loop body, so we want to knock off any 1367 // We are going to double the loop body, so we want to knock off any
1368 // odd iteration: (trip_cnt & ~1). Then back compute a new limit. 1368 // odd iteration: (trip_cnt & ~1). Then back compute a new limit.
1369 Node *span = new (C, 3) SubINode( limit, init ); 1369 Node *span = new (C) SubINode( limit, init );
1370 register_new_node( span, ctrl ); 1370 register_new_node( span, ctrl );
1371 Node *trip = new (C, 3) DivINode( 0, span, stride ); 1371 Node *trip = new (C) DivINode( 0, span, stride );
1372 register_new_node( trip, ctrl ); 1372 register_new_node( trip, ctrl );
1373 Node *mtwo = _igvn.intcon(-2); 1373 Node *mtwo = _igvn.intcon(-2);
1374 set_ctrl(mtwo, C->root()); 1374 set_ctrl(mtwo, C->root());
1375 Node *rond = new (C, 3) AndINode( trip, mtwo ); 1375 Node *rond = new (C) AndINode( trip, mtwo );
1376 register_new_node( rond, ctrl ); 1376 register_new_node( rond, ctrl );
1377 Node *spn2 = new (C, 3) MulINode( rond, stride ); 1377 Node *spn2 = new (C) MulINode( rond, stride );
1378 register_new_node( spn2, ctrl ); 1378 register_new_node( spn2, ctrl );
1379 new_limit = new (C, 3) AddINode( spn2, init ); 1379 new_limit = new (C) AddINode( spn2, init );
1380 register_new_node( new_limit, ctrl ); 1380 register_new_node( new_limit, ctrl );
1381 1381
1382 // Hammer in the new limit 1382 // Hammer in the new limit
1383 Node *ctrl2 = loop_end->in(0); 1383 Node *ctrl2 = loop_end->in(0);
1384 Node *cmp2 = new (C, 3) CmpINode( loop_head->incr(), new_limit ); 1384 Node *cmp2 = new (C) CmpINode( loop_head->incr(), new_limit );
1385 register_new_node( cmp2, ctrl2 ); 1385 register_new_node( cmp2, ctrl2 );
1386 Node *bol2 = new (C, 2) BoolNode( cmp2, loop_end->test_trip() ); 1386 Node *bol2 = new (C) BoolNode( cmp2, loop_end->test_trip() );
1387 register_new_node( bol2, ctrl2 ); 1387 register_new_node( bol2, ctrl2 );
1388 _igvn.hash_delete(loop_end); 1388 _igvn.hash_delete(loop_end);
1389 loop_end->set_req(CountedLoopEndNode::TestValue, bol2); 1389 loop_end->set_req(CountedLoopEndNode::TestValue, bol2);
1390 1390
1391 // Step 3: Find the min-trip test guaranteed before a 'main' loop. 1391 // Step 3: Find the min-trip test guaranteed before a 'main' loop.
1487 1487
1488 //------------------------------adjust_limit----------------------------------- 1488 //------------------------------adjust_limit-----------------------------------
1489 // Helper function for add_constraint(). 1489 // Helper function for add_constraint().
1490 Node* PhaseIdealLoop::adjust_limit(int stride_con, Node * scale, Node *offset, Node *rc_limit, Node *loop_limit, Node *pre_ctrl) { 1490 Node* PhaseIdealLoop::adjust_limit(int stride_con, Node * scale, Node *offset, Node *rc_limit, Node *loop_limit, Node *pre_ctrl) {
1491 // Compute "I :: (limit-offset)/scale" 1491 // Compute "I :: (limit-offset)/scale"
1492 Node *con = new (C, 3) SubINode(rc_limit, offset); 1492 Node *con = new (C) SubINode(rc_limit, offset);
1493 register_new_node(con, pre_ctrl); 1493 register_new_node(con, pre_ctrl);
1494 Node *X = new (C, 3) DivINode(0, con, scale); 1494 Node *X = new (C) DivINode(0, con, scale);
1495 register_new_node(X, pre_ctrl); 1495 register_new_node(X, pre_ctrl);
1496 1496
1497 // Adjust loop limit 1497 // Adjust loop limit
1498 loop_limit = (stride_con > 0) 1498 loop_limit = (stride_con > 0)
1499 ? (Node*)(new (C, 3) MinINode(loop_limit, X)) 1499 ? (Node*)(new (C) MinINode(loop_limit, X))
1500 : (Node*)(new (C, 3) MaxINode(loop_limit, X)); 1500 : (Node*)(new (C) MaxINode(loop_limit, X));
1501 register_new_node(loop_limit, pre_ctrl); 1501 register_new_node(loop_limit, pre_ctrl);
1502 return loop_limit; 1502 return loop_limit;
1503 } 1503 }
1504 1504
1505 //------------------------------add_constraint--------------------------------- 1505 //------------------------------add_constraint---------------------------------
1556 // 1556 //
1557 // Also (min_int+1 == -max_int) is used instead of min_int here 1557 // Also (min_int+1 == -max_int) is used instead of min_int here
1558 // to avoid problem with scale == -1 (min_int/(-1) == min_int). 1558 // to avoid problem with scale == -1 (min_int/(-1) == min_int).
1559 Node* shift = _igvn.intcon(31); 1559 Node* shift = _igvn.intcon(31);
1560 set_ctrl(shift, C->root()); 1560 set_ctrl(shift, C->root());
1561 Node* sign = new (C, 3) RShiftINode(offset, shift); 1561 Node* sign = new (C) RShiftINode(offset, shift);
1562 register_new_node(sign, pre_ctrl); 1562 register_new_node(sign, pre_ctrl);
1563 offset = new (C, 3) AndINode(offset, sign); 1563 offset = new (C) AndINode(offset, sign);
1564 register_new_node(offset, pre_ctrl); 1564 register_new_node(offset, pre_ctrl);
1565 } else { 1565 } else {
1566 assert(low_limit->get_int() == 0, "wrong low limit for range check"); 1566 assert(low_limit->get_int() == 0, "wrong low limit for range check");
1567 // The only problem we have here when offset == min_int 1567 // The only problem we have here when offset == min_int
1568 // since (0-min_int) == min_int. It may be fine for stride > 0 1568 // since (0-min_int) == min_int. It may be fine for stride > 0
1591 // To avoid it min(pre_limit, original_limit) is used 1591 // To avoid it min(pre_limit, original_limit) is used
1592 // in do_range_check() for stride > 0 and max() for < 0. 1592 // in do_range_check() for stride > 0 and max() for < 0.
1593 Node *one = _igvn.intcon(1); 1593 Node *one = _igvn.intcon(1);
1594 set_ctrl(one, C->root()); 1594 set_ctrl(one, C->root());
1595 1595
1596 Node *plus_one = new (C, 3) AddINode(offset, one); 1596 Node *plus_one = new (C) AddINode(offset, one);
1597 register_new_node( plus_one, pre_ctrl ); 1597 register_new_node( plus_one, pre_ctrl );
1598 // Pass (-stride) to indicate pre_loop_cond = NOT(main_loop_cond); 1598 // Pass (-stride) to indicate pre_loop_cond = NOT(main_loop_cond);
1599 *pre_limit = adjust_limit((-stride_con), scale, plus_one, upper_limit, *pre_limit, pre_ctrl); 1599 *pre_limit = adjust_limit((-stride_con), scale, plus_one, upper_limit, *pre_limit, pre_ctrl);
1600 1600
1601 if (low_limit->get_int() == -max_jint) { 1601 if (low_limit->get_int() == -max_jint) {
1609 // 1609 //
1610 // Also (min_int+1 == -max_int) is used instead of min_int here 1610 // Also (min_int+1 == -max_int) is used instead of min_int here
1611 // to avoid problem with scale == -1 (min_int/(-1) == min_int). 1611 // to avoid problem with scale == -1 (min_int/(-1) == min_int).
1612 Node* shift = _igvn.intcon(31); 1612 Node* shift = _igvn.intcon(31);
1613 set_ctrl(shift, C->root()); 1613 set_ctrl(shift, C->root());
1614 Node* sign = new (C, 3) RShiftINode(plus_one, shift); 1614 Node* sign = new (C) RShiftINode(plus_one, shift);
1615 register_new_node(sign, pre_ctrl); 1615 register_new_node(sign, pre_ctrl);
1616 plus_one = new (C, 3) AndINode(plus_one, sign); 1616 plus_one = new (C) AndINode(plus_one, sign);
1617 register_new_node(plus_one, pre_ctrl); 1617 register_new_node(plus_one, pre_ctrl);
1618 } else { 1618 } else {
1619 assert(low_limit->get_int() == 0, "wrong low limit for range check"); 1619 assert(low_limit->get_int() == 0, "wrong low limit for range check");
1620 // The only problem we have here when offset == max_int 1620 // The only problem we have here when offset == max_int
1621 // since (max_int+1) == min_int and (0-min_int) == min_int. 1621 // since (max_int+1) == min_int and (0-min_int) == min_int.
1694 if (depth < 2 && 1694 if (depth < 2 &&
1695 is_scaled_iv_plus_offset(exp->in(1), iv, p_scale, 1695 is_scaled_iv_plus_offset(exp->in(1), iv, p_scale,
1696 p_offset != NULL ? &offset2 : NULL, depth+1)) { 1696 p_offset != NULL ? &offset2 : NULL, depth+1)) {
1697 if (p_offset != NULL) { 1697 if (p_offset != NULL) {
1698 Node *ctrl_off2 = get_ctrl(offset2); 1698 Node *ctrl_off2 = get_ctrl(offset2);
1699 Node* offset = new (C, 3) AddINode(offset2, exp->in(2)); 1699 Node* offset = new (C) AddINode(offset2, exp->in(2));
1700 register_new_node(offset, ctrl_off2); 1700 register_new_node(offset, ctrl_off2);
1701 *p_offset = offset; 1701 *p_offset = offset;
1702 } 1702 }
1703 return true; 1703 return true;
1704 } 1704 }
1707 if (is_scaled_iv(exp->in(1), iv, p_scale)) { 1707 if (is_scaled_iv(exp->in(1), iv, p_scale)) {
1708 if (p_offset != NULL) { 1708 if (p_offset != NULL) {
1709 Node *zero = _igvn.intcon(0); 1709 Node *zero = _igvn.intcon(0);
1710 set_ctrl(zero, C->root()); 1710 set_ctrl(zero, C->root());
1711 Node *ctrl_off = get_ctrl(exp->in(2)); 1711 Node *ctrl_off = get_ctrl(exp->in(2));
1712 Node* offset = new (C, 3) SubINode(zero, exp->in(2)); 1712 Node* offset = new (C) SubINode(zero, exp->in(2));
1713 register_new_node(offset, ctrl_off); 1713 register_new_node(offset, ctrl_off);
1714 *p_offset = offset; 1714 *p_offset = offset;
1715 } 1715 }
1716 return true; 1716 return true;
1717 } 1717 }
1910 case BoolTest::gt: 1910 case BoolTest::gt:
1911 // Fall into GE case 1911 // Fall into GE case
1912 case BoolTest::ge: 1912 case BoolTest::ge:
1913 // Convert (I*scale+offset) >= Limit to (I*(-scale)+(-offset)) <= -Limit 1913 // Convert (I*scale+offset) >= Limit to (I*(-scale)+(-offset)) <= -Limit
1914 scale_con = -scale_con; 1914 scale_con = -scale_con;
1915 offset = new (C, 3) SubINode( zero, offset ); 1915 offset = new (C) SubINode( zero, offset );
1916 register_new_node( offset, pre_ctrl ); 1916 register_new_node( offset, pre_ctrl );
1917 limit = new (C, 3) SubINode( zero, limit ); 1917 limit = new (C) SubINode( zero, limit );
1918 register_new_node( limit, pre_ctrl ); 1918 register_new_node( limit, pre_ctrl );
1919 // Fall into LE case 1919 // Fall into LE case
1920 case BoolTest::le: 1920 case BoolTest::le:
1921 if (b_test._test != BoolTest::gt) { 1921 if (b_test._test != BoolTest::gt) {
1922 // Convert X <= Y to X < Y+1 1922 // Convert X <= Y to X < Y+1
1923 limit = new (C, 3) AddINode( limit, one ); 1923 limit = new (C) AddINode( limit, one );
1924 register_new_node( limit, pre_ctrl ); 1924 register_new_node( limit, pre_ctrl );
1925 } 1925 }
1926 // Fall into LT case 1926 // Fall into LT case
1927 case BoolTest::lt: 1927 case BoolTest::lt:
1928 // The underflow and overflow limits: MIN_INT <= scale*I+offset < limit 1928 // The underflow and overflow limits: MIN_INT <= scale*I+offset < limit
1969 1969
1970 } 1970 }
1971 1971
1972 // Update loop limits 1972 // Update loop limits
1973 if (conditional_rc) { 1973 if (conditional_rc) {
1974 pre_limit = (stride_con > 0) ? (Node*)new (C,3) MinINode(pre_limit, orig_limit) 1974 pre_limit = (stride_con > 0) ? (Node*)new (C) MinINode(pre_limit, orig_limit)
1975 : (Node*)new (C,3) MaxINode(pre_limit, orig_limit); 1975 : (Node*)new (C) MaxINode(pre_limit, orig_limit);
1976 register_new_node(pre_limit, pre_ctrl); 1976 register_new_node(pre_limit, pre_ctrl);
1977 } 1977 }
1978 _igvn.hash_delete(pre_opaq); 1978 _igvn.hash_delete(pre_opaq);
1979 pre_opaq->set_req(1, pre_limit); 1979 pre_opaq->set_req(1, pre_limit);
1980 1980
1985 // "Standard" round-up logic: ([main_limit-init+(y-1)]/y)*y+init 1985 // "Standard" round-up logic: ([main_limit-init+(y-1)]/y)*y+init
1986 // Hopefully, compiler will optimize for powers of 2. 1986 // Hopefully, compiler will optimize for powers of 2.
1987 Node *ctrl = get_ctrl(main_limit); 1987 Node *ctrl = get_ctrl(main_limit);
1988 Node *stride = cl->stride(); 1988 Node *stride = cl->stride();
1989 Node *init = cl->init_trip(); 1989 Node *init = cl->init_trip();
1990 Node *span = new (C, 3) SubINode(main_limit,init); 1990 Node *span = new (C) SubINode(main_limit,init);
1991 register_new_node(span,ctrl); 1991 register_new_node(span,ctrl);
1992 Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1)); 1992 Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1));
1993 Node *add = new (C, 3) AddINode(span,rndup); 1993 Node *add = new (C) AddINode(span,rndup);
1994 register_new_node(add,ctrl); 1994 register_new_node(add,ctrl);
1995 Node *div = new (C, 3) DivINode(0,add,stride); 1995 Node *div = new (C) DivINode(0,add,stride);
1996 register_new_node(div,ctrl); 1996 register_new_node(div,ctrl);
1997 Node *mul = new (C, 3) MulINode(div,stride); 1997 Node *mul = new (C) MulINode(div,stride);
1998 register_new_node(mul,ctrl); 1998 register_new_node(mul,ctrl);
1999 Node *newlim = new (C, 3) AddINode(mul,init); 1999 Node *newlim = new (C) AddINode(mul,init);
2000 register_new_node(newlim,ctrl); 2000 register_new_node(newlim,ctrl);
2001 main_limit = newlim; 2001 main_limit = newlim;
2002 } 2002 }
2003 2003
2004 Node *main_cle = cl->loopexit(); 2004 Node *main_cle = cl->loopexit();
2165 phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist 2165 phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist
2166 phase->_igvn.replace_input_of(cmp, 2, exact_limit); // put cmp on worklist 2166 phase->_igvn.replace_input_of(cmp, 2, exact_limit); // put cmp on worklist
2167 } 2167 }
2168 // Note: the final value after increment should not overflow since 2168 // Note: the final value after increment should not overflow since
2169 // counted loop has limit check predicate. 2169 // counted loop has limit check predicate.
2170 Node *final = new (phase->C, 3) SubINode( exact_limit, cl->stride() ); 2170 Node *final = new (phase->C) SubINode( exact_limit, cl->stride() );
2171 phase->register_new_node(final,cl->in(LoopNode::EntryControl)); 2171 phase->register_new_node(final,cl->in(LoopNode::EntryControl));
2172 phase->_igvn.replace_node(phi,final); 2172 phase->_igvn.replace_node(phi,final);
2173 phase->C->set_major_progress(); 2173 phase->C->set_major_progress();
2174 return true; 2174 return true;
2175 } 2175 }
2411 if (store != NULL) { 2411 if (store != NULL) {
2412 msg = "multiple stores"; 2412 msg = "multiple stores";
2413 break; 2413 break;
2414 } 2414 }
2415 int opc = n->Opcode(); 2415 int opc = n->Opcode();
2416 if (opc == Op_StoreP || opc == Op_StoreN || opc == Op_StoreCM) { 2416 if (opc == Op_StoreP || opc == Op_StoreN || opc == Op_StoreNKlass || opc == Op_StoreCM) {
2417 msg = "oop fills not handled"; 2417 msg = "oop fills not handled";
2418 break; 2418 break;
2419 } 2419 }
2420 Node* value = n->in(MemNode::ValueIn); 2420 Node* value = n->in(MemNode::ValueIn);
2421 if (!lpt->is_invariant(value)) { 2421 if (!lpt->is_invariant(value)) {
2649 Node* base = store->in(MemNode::Address)->as_AddP()->in(AddPNode::Base); 2649 Node* base = store->in(MemNode::Address)->as_AddP()->in(AddPNode::Base);
2650 2650
2651 // Build an expression for the beginning of the copy region 2651 // Build an expression for the beginning of the copy region
2652 Node* index = head->init_trip(); 2652 Node* index = head->init_trip();
2653 #ifdef _LP64 2653 #ifdef _LP64
2654 index = new (C, 2) ConvI2LNode(index); 2654 index = new (C) ConvI2LNode(index);
2655 _igvn.register_new_node_with_optimizer(index); 2655 _igvn.register_new_node_with_optimizer(index);
2656 #endif 2656 #endif
2657 if (shift != NULL) { 2657 if (shift != NULL) {
2658 // byte arrays don't require a shift but others do. 2658 // byte arrays don't require a shift but others do.
2659 index = new (C, 3) LShiftXNode(index, shift->in(2)); 2659 index = new (C) LShiftXNode(index, shift->in(2));
2660 _igvn.register_new_node_with_optimizer(index); 2660 _igvn.register_new_node_with_optimizer(index);
2661 } 2661 }
2662 index = new (C, 4) AddPNode(base, base, index); 2662 index = new (C) AddPNode(base, base, index);
2663 _igvn.register_new_node_with_optimizer(index); 2663 _igvn.register_new_node_with_optimizer(index);
2664 Node* from = new (C, 4) AddPNode(base, index, offset); 2664 Node* from = new (C) AddPNode(base, index, offset);
2665 _igvn.register_new_node_with_optimizer(from); 2665 _igvn.register_new_node_with_optimizer(from);
2666 // Compute the number of elements to copy 2666 // Compute the number of elements to copy
2667 Node* len = new (C, 3) SubINode(head->limit(), head->init_trip()); 2667 Node* len = new (C) SubINode(head->limit(), head->init_trip());
2668 _igvn.register_new_node_with_optimizer(len); 2668 _igvn.register_new_node_with_optimizer(len);
2669 2669
2670 BasicType t = store->as_Mem()->memory_type(); 2670 BasicType t = store->as_Mem()->memory_type();
2671 bool aligned = false; 2671 bool aligned = false;
2672 if (offset != NULL && head->init_trip()->is_Con()) { 2672 if (offset != NULL && head->init_trip()->is_Con()) {
2679 address fill = StubRoutines::select_fill_function(t, aligned, fill_name); 2679 address fill = StubRoutines::select_fill_function(t, aligned, fill_name);
2680 assert(fill != NULL, "what?"); 2680 assert(fill != NULL, "what?");
2681 2681
2682 // Convert float/double to int/long for fill routines 2682 // Convert float/double to int/long for fill routines
2683 if (t == T_FLOAT) { 2683 if (t == T_FLOAT) {
2684 store_value = new (C, 2) MoveF2INode(store_value); 2684 store_value = new (C) MoveF2INode(store_value);
2685 _igvn.register_new_node_with_optimizer(store_value); 2685 _igvn.register_new_node_with_optimizer(store_value);
2686 } else if (t == T_DOUBLE) { 2686 } else if (t == T_DOUBLE) {
2687 store_value = new (C, 2) MoveD2LNode(store_value); 2687 store_value = new (C) MoveD2LNode(store_value);
2688 _igvn.register_new_node_with_optimizer(store_value); 2688 _igvn.register_new_node_with_optimizer(store_value);
2689 } 2689 }
2690 2690
2691 Node* mem_phi = store->in(MemNode::Memory); 2691 Node* mem_phi = store->in(MemNode::Memory);
2692 Node* result_ctrl; 2692 Node* result_ctrl;
2693 Node* result_mem; 2693 Node* result_mem;
2694 const TypeFunc* call_type = OptoRuntime::array_fill_Type(); 2694 const TypeFunc* call_type = OptoRuntime::array_fill_Type();
2695 int size = call_type->domain()->cnt(); 2695 CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill,
2696 CallLeafNode *call = new (C, size) CallLeafNoFPNode(call_type, fill, 2696 fill_name, TypeAryPtr::get_array_body_type(t));
2697 fill_name, TypeAryPtr::get_array_body_type(t));
2698 call->init_req(TypeFunc::Parms+0, from); 2697 call->init_req(TypeFunc::Parms+0, from);
2699 call->init_req(TypeFunc::Parms+1, store_value); 2698 call->init_req(TypeFunc::Parms+1, store_value);
2700 #ifdef _LP64 2699 #ifdef _LP64
2701 len = new (C, 2) ConvI2LNode(len); 2700 len = new (C) ConvI2LNode(len);
2702 _igvn.register_new_node_with_optimizer(len); 2701 _igvn.register_new_node_with_optimizer(len);
2703 #endif 2702 #endif
2704 call->init_req(TypeFunc::Parms+2, len); 2703 call->init_req(TypeFunc::Parms+2, len);
2705 #ifdef _LP64 2704 #ifdef _LP64
2706 call->init_req(TypeFunc::Parms+3, C->top()); 2705 call->init_req(TypeFunc::Parms+3, C->top());
2709 call->init_req( TypeFunc::I_O , C->top() ) ; // does no i/o 2708 call->init_req( TypeFunc::I_O , C->top() ) ; // does no i/o
2710 call->init_req( TypeFunc::Memory , mem_phi->in(LoopNode::EntryControl) ); 2709 call->init_req( TypeFunc::Memory , mem_phi->in(LoopNode::EntryControl) );
2711 call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) ); 2710 call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) );
2712 call->init_req( TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr) ); 2711 call->init_req( TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr) );
2713 _igvn.register_new_node_with_optimizer(call); 2712 _igvn.register_new_node_with_optimizer(call);
2714 result_ctrl = new (C, 1) ProjNode(call,TypeFunc::Control); 2713 result_ctrl = new (C) ProjNode(call,TypeFunc::Control);
2715 _igvn.register_new_node_with_optimizer(result_ctrl); 2714 _igvn.register_new_node_with_optimizer(result_ctrl);
2716 result_mem = new (C, 1) ProjNode(call,TypeFunc::Memory); 2715 result_mem = new (C) ProjNode(call,TypeFunc::Memory);
2717 _igvn.register_new_node_with_optimizer(result_mem); 2716 _igvn.register_new_node_with_optimizer(result_mem);
2718 2717
2719 /* Disable following optimization until proper fix (add missing checks). 2718 /* Disable following optimization until proper fix (add missing checks).
2720 2719
2721 // If this fill is tightly coupled to an allocation and overwrites 2720 // If this fill is tightly coupled to an allocation and overwrites