@@ -467,48 +467,44 @@ bool AMDGPUCombinerHelper::matchCombineFmulWithSelectToFldexp(
467467 if ((ScalarDestTy == LLT::float64 () || ScalarDestTy == LLT::float32 () ||
468468 ScalarDestTy == LLT::float16 ()) &&
469469 (MRI.hasOneNonDBGUse (Sel.getOperand (0 ).getReg ()))) {
470- Register SelectCond = Sel.getOperand (1 ).getReg ();
471- Register SelectTrue = Sel.getOperand (2 ).getReg ();
472- Register SelectFalse = Sel.getOperand (3 ).getReg ();
473-
474- const auto SelectTrueCst =
475- DestTy.isVector ()
476- ? getFConstantSplat (SelectTrue, MRI, /* allowUndef=*/ false )
477- : getFConstantVRegValWithLookThrough (SelectTrue, MRI);
478- if (!SelectTrueCst)
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)
479477 return false ;
480- const auto SelectFalseCst =
481- DestTy.isVector ()
482- ? getFConstantSplat (SelectFalse, MRI, /* allowUndef=*/ false )
483- : getFConstantVRegValWithLookThrough (SelectFalse, MRI);
484- if (!SelectFalseCst)
478+ const auto SelectFalseVal =
479+ isConstantOrConstantSplatVectorFP (*SelectFalse, MRI);
480+ if (!SelectFalseVal)
485481 return false ;
486482
487- if (SelectTrueCst-> Value . isNegative () != SelectFalseCst-> Value . isNegative ())
483+ if (SelectTrueVal-> isNegative () != SelectFalseVal-> isNegative ())
488484 return false ;
489485
490486 // For f32, only non-inline constants should be transformed.
491487 if (ScalarDestTy == LLT::float32 () &&
492- TII.isInlineConstant (SelectTrueCst-> Value ) &&
493- TII.isInlineConstant (SelectFalseCst-> Value ))
488+ TII.isInlineConstant (*SelectTrueVal ) &&
489+ TII.isInlineConstant (*SelectFalseVal ))
494490 return false ;
495491
496- int SelectTrueVal = SelectTrueCst-> Value . getExactLog2Abs ();
497- if (SelectTrueVal == INT_MIN)
492+ int SelectTrueLog2Val = SelectTrueVal-> getExactLog2Abs ();
493+ if (SelectTrueLog2Val == INT_MIN)
498494 return false ;
499- int SelectFalseVal = SelectFalseCst-> Value . getExactLog2Abs ();
500- if (SelectFalseVal == INT_MIN)
495+ int SelectFalseLog2Val = SelectFalseVal-> getExactLog2Abs ();
496+ if (SelectFalseLog2Val == INT_MIN)
501497 return false ;
502498
503499 MatchInfo = [=, &MI](MachineIRBuilder &Builder) {
504500 LLT IntDestTy = DestTy.changeElementType (LLT::scalar (32 ));
505- auto NewSel =
506- Builder. buildSelect ( IntDestTy, SelectCond ,
507- Builder.buildConstant (IntDestTy, SelectTrueVal ),
508- Builder.buildConstant (IntDestTy, SelectFalseVal ));
501+ auto NewSel = Builder. buildSelect (
502+ IntDestTy, SelectCondReg ,
503+ Builder.buildConstant (IntDestTy, SelectTrueLog2Val ),
504+ Builder.buildConstant (IntDestTy, SelectFalseLog2Val ));
509505
510506 Register XReg = MI.getOperand (1 ).getReg ();
511- if (SelectTrueCst-> Value . isNegative ()) {
507+ if (SelectTrueVal-> isNegative ()) {
512508 auto NegX =
513509 Builder.buildFNeg (DestTy, XReg, MRI.getVRegDef (XReg)->getFlags ());
514510 Builder.buildFLdexp (Dst, NegX, NewSel, MI.getFlags ());
0 commit comments