@@ -464,57 +464,55 @@ bool AMDGPUCombinerHelper::matchCombineFmulWithSelectToFldexp(
464464 LLT DestTy = MRI.getType (Dst);
465465 LLT ScalarDestTy = DestTy.getScalarType ();
466466
467- if ((ScalarDestTy == LLT::float64 () || ScalarDestTy == LLT::float32 () ||
468- ScalarDestTy == LLT::float16 ()) &&
469- (MRI.hasOneNonDBGUse (Sel.getOperand (0 ).getReg ()))) {
470- Register SelectCondReg = Sel.getOperand (1 ).getReg ();
471- MachineInstr *SelectTrue = MRI.getVRegDef (Sel.getOperand (2 ).getReg ());
472- MachineInstr *SelectFalse = MRI.getVRegDef (Sel.getOperand (3 ).getReg ());
473-
474- const auto SelectTrueVal =
475- isConstantOrConstantSplatVectorFP (*SelectTrue, MRI);
476- if (!SelectTrueVal)
477- return false ;
478- const auto SelectFalseVal =
479- isConstantOrConstantSplatVectorFP (*SelectFalse, MRI);
480- if (!SelectFalseVal)
481- return false ;
467+ if ((ScalarDestTy != LLT::float64 () && ScalarDestTy != LLT::float32 () &&
468+ ScalarDestTy != LLT::float16 ()) ||
469+ !MRI.hasOneNonDBGUse (Sel.getOperand (0 ).getReg ()))
470+ return false ;
482471
483- if (SelectTrueVal->isNegative () != SelectFalseVal->isNegative ())
484- return false ;
472+ Register SelectCondReg = Sel.getOperand (1 ).getReg ();
473+ MachineInstr *SelectTrue = MRI.getVRegDef (Sel.getOperand (2 ).getReg ());
474+ MachineInstr *SelectFalse = MRI.getVRegDef (Sel.getOperand (3 ).getReg ());
485475
486- // For f32, only non-inline constants should be transformed.
487- if (ScalarDestTy == LLT::float32 () &&
488- TII.isInlineConstant (*SelectTrueVal) &&
489- TII.isInlineConstant (*SelectFalseVal))
490- return false ;
476+ const auto SelectTrueVal =
477+ isConstantOrConstantSplatVectorFP (*SelectTrue, MRI);
478+ if (!SelectTrueVal)
479+ return false ;
480+ const auto SelectFalseVal =
481+ isConstantOrConstantSplatVectorFP (*SelectFalse, MRI);
482+ if (!SelectFalseVal)
483+ return false ;
491484
492- int SelectTrueLog2Val = SelectTrueVal->getExactLog2Abs ();
493- if (SelectTrueLog2Val == INT_MIN)
494- return false ;
495- int SelectFalseLog2Val = SelectFalseVal->getExactLog2Abs ();
496- if (SelectFalseLog2Val == INT_MIN)
497- return false ;
485+ if (SelectTrueVal->isNegative () != SelectFalseVal->isNegative ())
486+ return false ;
498487
499- MatchInfo = [=, &MI](MachineIRBuilder &Builder) {
500- LLT IntDestTy = DestTy.changeElementType (LLT::scalar (32 ));
501- auto NewSel = Builder.buildSelect (
502- IntDestTy, SelectCondReg,
503- Builder.buildConstant (IntDestTy, SelectTrueLog2Val),
504- Builder.buildConstant (IntDestTy, SelectFalseLog2Val));
505-
506- Register XReg = MI.getOperand (1 ).getReg ();
507- if (SelectTrueVal->isNegative ()) {
508- auto NegX =
509- Builder.buildFNeg (DestTy, XReg, MRI.getVRegDef (XReg)->getFlags ());
510- Builder.buildFLdexp (Dst, NegX, NewSel, MI.getFlags ());
511- } else {
512- Builder.buildFLdexp (Dst, XReg, NewSel, MI.getFlags ());
513- }
514- };
488+ // For f32, only non-inline constants should be transformed.
489+ if (ScalarDestTy == LLT::float32 () && TII.isInlineConstant (*SelectTrueVal) &&
490+ TII.isInlineConstant (*SelectFalseVal))
491+ return false ;
515492
516- return true ;
517- }
493+ int SelectTrueLog2Val = SelectTrueVal->getExactLog2Abs ();
494+ if (SelectTrueLog2Val == INT_MIN)
495+ return false ;
496+ int SelectFalseLog2Val = SelectFalseVal->getExactLog2Abs ();
497+ if (SelectFalseLog2Val == INT_MIN)
498+ return false ;
518499
519- return false ;
500+ MatchInfo = [=, &MI](MachineIRBuilder &Builder) {
501+ LLT IntDestTy = DestTy.changeElementType (LLT::scalar (32 ));
502+ auto NewSel = Builder.buildSelect (
503+ IntDestTy, SelectCondReg,
504+ Builder.buildConstant (IntDestTy, SelectTrueLog2Val),
505+ Builder.buildConstant (IntDestTy, SelectFalseLog2Val));
506+
507+ Register XReg = MI.getOperand (1 ).getReg ();
508+ if (SelectTrueVal->isNegative ()) {
509+ auto NegX =
510+ Builder.buildFNeg (DestTy, XReg, MRI.getVRegDef (XReg)->getFlags ());
511+ Builder.buildFLdexp (Dst, NegX, NewSel, MI.getFlags ());
512+ } else {
513+ Builder.buildFLdexp (Dst, XReg, NewSel, MI.getFlags ());
514+ }
515+ };
516+
517+ return true ;
520518}
0 commit comments