@@ -804,6 +804,10 @@ void Matcher::Fixup_Save_On_Entry( ) {
804
804
if (ret_edge_cnt > TypeFunc::Parms)
805
805
ret_rms[TypeFunc::Parms+0 ] = _return_value_mask;
806
806
807
+ // Input RegMask array shared by all ForwardExceptions
808
+ uint forw_exc_edge_cnt = TypeFunc::Parms;
809
+ RegMask* forw_exc_rms = init_input_masks ( forw_exc_edge_cnt + soe_cnt, _return_addr_mask, c_frame_ptr_mask );
810
+
807
811
// Input RegMask array shared by all Rethrows.
808
812
uint reth_edge_cnt = TypeFunc::Parms+1 ;
809
813
RegMask *reth_rms = init_input_masks ( reth_edge_cnt + soe_cnt, _return_addr_mask, c_frame_ptr_mask );
@@ -863,6 +867,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
863
867
case Op_Rethrow : exit ->_in_rms = reth_rms; break ;
864
868
case Op_TailCall : exit ->_in_rms = tail_call_rms; break ;
865
869
case Op_TailJump : exit ->_in_rms = tail_jump_rms; break ;
870
+ case Op_ForwardException: exit ->_in_rms = forw_exc_rms; break ;
866
871
case Op_Halt : exit ->_in_rms = halt_rms; break ;
867
872
default : ShouldNotReachHere ();
868
873
}
@@ -882,6 +887,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
882
887
reth_rms [ reth_edge_cnt] = mreg2regmask[i];
883
888
tail_call_rms[tail_call_edge_cnt] = mreg2regmask[i];
884
889
tail_jump_rms[tail_jump_edge_cnt] = mreg2regmask[i];
890
+ forw_exc_rms [ forw_exc_edge_cnt] = mreg2regmask[i];
885
891
// Halts need the SOE registers, but only in the stack as debug info.
886
892
// A just-prior uncommon-trap or deoptimization will use the SOE regs.
887
893
halt_rms [ halt_edge_cnt] = *idealreg2spillmask[_register_save_type[i]];
@@ -899,6 +905,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
899
905
reth_rms [ reth_edge_cnt].Insert (OptoReg::Name (i+1 ));
900
906
tail_call_rms[tail_call_edge_cnt].Insert (OptoReg::Name (i+1 ));
901
907
tail_jump_rms[tail_jump_edge_cnt].Insert (OptoReg::Name (i+1 ));
908
+ forw_exc_rms [ forw_exc_edge_cnt].Insert (OptoReg::Name (i+1 ));
902
909
halt_rms [ halt_edge_cnt].Insert (OptoReg::Name (i+1 ));
903
910
mproj = new MachProjNode ( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
904
911
proj_cnt += 2 ; // Skip 2 for doubles
@@ -911,6 +918,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
911
918
reth_rms [ reth_edge_cnt] = RegMask::Empty;
912
919
tail_call_rms[tail_call_edge_cnt] = RegMask::Empty;
913
920
tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty;
921
+ forw_exc_rms [ forw_exc_edge_cnt] = RegMask::Empty;
914
922
halt_rms [ halt_edge_cnt] = RegMask::Empty;
915
923
mproj = C->top ();
916
924
}
@@ -925,6 +933,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
925
933
reth_rms [ reth_edge_cnt].Insert (OptoReg::Name (i+1 ));
926
934
tail_call_rms[tail_call_edge_cnt].Insert (OptoReg::Name (i+1 ));
927
935
tail_jump_rms[tail_jump_edge_cnt].Insert (OptoReg::Name (i+1 ));
936
+ forw_exc_rms [ forw_exc_edge_cnt].Insert (OptoReg::Name (i+1 ));
928
937
halt_rms [ halt_edge_cnt].Insert (OptoReg::Name (i+1 ));
929
938
mproj = new MachProjNode ( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
930
939
proj_cnt += 2 ; // Skip 2 for longs
@@ -937,6 +946,7 @@ void Matcher::Fixup_Save_On_Entry( ) {
937
946
reth_rms [ reth_edge_cnt] = RegMask::Empty;
938
947
tail_call_rms[tail_call_edge_cnt] = RegMask::Empty;
939
948
tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty;
949
+ forw_exc_rms [ forw_exc_edge_cnt] = RegMask::Empty;
940
950
halt_rms [ halt_edge_cnt] = RegMask::Empty;
941
951
mproj = C->top ();
942
952
} else {
@@ -948,11 +958,13 @@ void Matcher::Fixup_Save_On_Entry( ) {
948
958
reth_edge_cnt ++;
949
959
tail_call_edge_cnt ++;
950
960
tail_jump_edge_cnt ++;
961
+ forw_exc_edge_cnt++;
951
962
halt_edge_cnt ++;
952
963
953
964
// Add a use of the SOE register to all exit paths
954
- for ( uint j=1 ; j < root->req (); j++ )
965
+ for ( uint j=1 ; j < root->req (); j++) {
955
966
root->in (j)->add_req (mproj);
967
+ }
956
968
} // End of if a save-on-entry register
957
969
} // End of for all machine registers
958
970
}
@@ -1070,6 +1082,7 @@ static void match_alias_type(Compile* C, Node* n, Node* m) {
1070
1082
case Op_Halt:
1071
1083
case Op_TailCall:
1072
1084
case Op_TailJump:
1085
+ case Op_ForwardException:
1073
1086
nidx = Compile::AliasIdxBot;
1074
1087
nat = TypePtr::BOTTOM;
1075
1088
break ;
1 commit comments
openjdk-notifier[bot] commentedon Aug 12, 2024
Review
Issues