@@ -743,41 +743,47 @@ Node* OrINode::Identity(PhaseGVN* phase) {
743743 return AddNode::Identity (phase);
744744}
745745
746- Node *OrINode::Ideal (PhaseGVN *phase, bool can_reshape) {
746+ // Find shift value for Integer or Long OR.
747+ Node* rotate_shift (PhaseGVN* phase, Node* lshift, Node* rshift, int mask) {
748+ // val << norm_con_shift | val >> ({32|64} - norm_con_shift) => rotate_left val, norm_con_shift
749+ const TypeInt* lshift_t = phase->type (lshift)->isa_int ();
750+ const TypeInt* rshift_t = phase->type (rshift)->isa_int ();
751+ if (lshift_t != NULL && lshift_t ->is_con () &&
752+ rshift_t != NULL && rshift_t ->is_con () &&
753+ ((lshift_t ->get_con () & mask) == ((mask + 1 ) - (rshift_t ->get_con () & mask)))) {
754+ return phase->intcon (lshift_t ->get_con () & mask);
755+ }
756+ // val << var_shift | val >> ({0|32|64} - var_shift) => rotate_left val, var_shift
757+ if (rshift->Opcode () == Op_SubI && rshift->in (2 ) == lshift && rshift->in (1 )->is_Con ()){
758+ const TypeInt* shift_t = phase->type (rshift->in (1 ))->isa_int ();
759+ if (shift_t != NULL && shift_t ->is_con () &&
760+ (shift_t ->get_con () == 0 || shift_t ->get_con () == (mask + 1 ))) {
761+ return lshift;
762+ }
763+ }
764+ return NULL ;
765+ }
766+
767+ Node* OrINode::Ideal (PhaseGVN* phase, bool can_reshape) {
747768 int lopcode = in (1 )->Opcode ();
748769 int ropcode = in (2 )->Opcode ();
749770 if (Matcher::match_rule_supported (Op_RotateLeft) &&
750771 lopcode == Op_LShiftI && ropcode == Op_URShiftI && in (1 )->in (1 ) == in (2 )->in (1 )) {
751- Node *lshift = in (1 )->in (2 );
752- Node *rshift = in (2 )->in (2 );
753- // val << norm_con_shift | val >> (32 - norm_con_shift) => rotate_left val , norm_con_shift
754- if (lshift->is_Con () && rshift->is_Con () &&
755- ((lshift->get_int () & 0x1F ) == (32 - (rshift->get_int () & 0x1F )))) {
756- return new RotateLeftNode (in (1 )->in (1 ),
757- phase->intcon (lshift->get_int () & 0x1F ), TypeInt::INT);
758- }
759- // val << var_shift | val >> (0/32 - var_shift) => rotate_left val , var_shift
760- if (rshift->Opcode () == Op_SubI && rshift->in (2 ) == lshift &&
761- rshift->in (1 )->is_Con () &&
762- (rshift->in (1 )->get_int () == 0 || rshift->in (1 )->get_int () == 32 )) {
763- return new RotateLeftNode (in (1 )->in (1 ), lshift, TypeInt::INT);
772+ Node* lshift = in (1 )->in (2 );
773+ Node* rshift = in (2 )->in (2 );
774+ Node* shift = rotate_shift (phase, lshift, rshift, 0x1F );
775+ if (shift != NULL ) {
776+ return new RotateLeftNode (in (1 )->in (1 ), shift, TypeInt::INT);
764777 }
778+ return NULL ;
765779 }
766780 if (Matcher::match_rule_supported (Op_RotateRight) &&
767781 lopcode == Op_URShiftI && ropcode == Op_LShiftI && in (1 )->in (1 ) == in (2 )->in (1 )) {
768782 Node *rshift = in (1 )->in (2 );
769783 Node *lshift = in (2 )->in (2 );
770- // val >> norm_con_shift | val << (32 - norm_con_shift) => rotate_right val , norm_con_shift
771- if (rshift->is_Con () && lshift->is_Con () &&
772- ((rshift->get_int () & 0x1F ) == (32 - (lshift->get_int () & 0x1F )))) {
773- return new RotateRightNode (in (1 )->in (1 ),
774- phase->intcon (rshift->get_int () & 0x1F ), TypeInt::INT);
775- }
776- // val >> var_shift | val << (0/32 - var_shift) => rotate_right val , var_shift
777- if (lshift->Opcode () == Op_SubI && lshift->in (2 ) == rshift &&
778- lshift->in (1 )->is_Con () &&
779- (lshift->in (1 )->get_int () == 0 || lshift->in (1 )->get_int () == 32 )) {
780- return new RotateRightNode (in (1 )->in (1 ), rshift, TypeInt::INT);
784+ Node* shift = rotate_shift (phase, rshift, lshift, 0x1F );
785+ if (shift != NULL ) {
786+ return new RotateRightNode (in (1 )->in (1 ), shift, TypeInt::INT);
781787 }
782788 }
783789 return NULL ;
@@ -824,42 +830,27 @@ Node* OrLNode::Identity(PhaseGVN* phase) {
824830 return AddNode::Identity (phase);
825831}
826832
827- Node * OrLNode::Ideal (PhaseGVN * phase, bool can_reshape) {
833+ Node* OrLNode::Ideal (PhaseGVN* phase, bool can_reshape) {
828834 int lopcode = in (1 )->Opcode ();
829835 int ropcode = in (2 )->Opcode ();
830836 if (Matcher::match_rule_supported (Op_RotateLeft) &&
831837 lopcode == Op_LShiftL && ropcode == Op_URShiftL && in (1 )->in (1 ) == in (2 )->in (1 )) {
832- Node *lshift = in (1 )->in (2 );
833- Node *rshift = in (2 )->in (2 );
834- // val << norm_con_shift | val >> (64 - norm_con_shift) => rotate_left val , norm_con_shift
835- if (lshift->is_Con () && rshift->is_Con () &&
836- ((lshift->get_int () & 0x3F ) == (64 - (rshift->get_int () & 0x3F )))) {
837- return new RotateLeftNode (in (1 )->in (1 ),
838- phase->intcon (lshift->get_int () & 0x3F ), TypeLong::LONG);
839- }
840- // val << var_shift | val >> (0/64 - var_shift) => rotate_left val , var_shift
841- if (rshift->Opcode () == Op_SubI && rshift->in (2 ) == lshift &&
842- rshift->in (1 )->is_Con () &&
843- (rshift->in (1 )->get_int () == 0 || rshift->in (1 )->get_int () == 64 )) {
844- return new RotateLeftNode (in (1 )->in (1 ), lshift, TypeLong::LONG);
845- }
838+ Node* lshift = in (1 )->in (2 );
839+ Node* rshift = in (2 )->in (2 );
840+ Node* shift = rotate_shift (phase, lshift, rshift, 0x3F );
841+ if (shift != NULL ) {
842+ return new RotateLeftNode (in (1 )->in (1 ), shift, TypeLong::LONG);
843+ }
844+ return NULL ;
846845 }
847846 if (Matcher::match_rule_supported (Op_RotateRight) &&
848847 lopcode == Op_URShiftL && ropcode == Op_LShiftL && in (1 )->in (1 ) == in (2 )->in (1 )) {
849- Node *rshift = in (1 )->in (2 );
850- Node *lshift = in (2 )->in (2 );
851- // val >> norm_con_shift | val << (64 - norm_con_shift) => rotate_right val , norm_con_shift
852- if (rshift->is_Con () && lshift->is_Con () &&
853- ((rshift->get_int () & 0x3F ) == (64 - (lshift->get_int () & 0x3F )))) {
854- return new RotateRightNode (in (1 )->in (1 ),
855- phase->intcon (rshift->get_int () & 0x3F ), TypeLong::LONG);
856- }
857- // val >> var_shift | val << (0/64 - var_shift) => rotate_right val , var_shift
858- if (lshift->Opcode () == Op_SubI && lshift->in (2 ) == rshift &&
859- lshift->in (1 )->is_Con () &&
860- (lshift->in (1 )->get_int () == 0 || lshift->in (1 )->get_int () == 64 )) {
861- return new RotateRightNode (in (1 )->in (1 ), rshift, TypeLong::LONG);
862- }
848+ Node* rshift = in (1 )->in (2 );
849+ Node* lshift = in (2 )->in (2 );
850+ Node* shift = rotate_shift (phase, rshift, lshift, 0x3F );
851+ if (shift != NULL ) {
852+ return new RotateRightNode (in (1 )->in (1 ), shift, TypeLong::LONG);
853+ }
863854 }
864855 return NULL ;
865856}
0 commit comments