@@ -485,9 +485,7 @@ static bool RetCC_Hexagon32(unsigned ValNo, MVT ValVT,
485485    }
486486  }
487487
488-   unsigned  Offset = State.AllocateStack (4 , 4 );
489-   State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
490-   return  false ;
488+   return  true ;
491489}
492490
493491static  bool  RetCC_Hexagon64 (unsigned  ValNo, MVT ValVT,
@@ -500,9 +498,7 @@ static bool RetCC_Hexagon64(unsigned ValNo, MVT ValVT,
500498    }
501499  }
502500
503-   unsigned  Offset = State.AllocateStack (8 , 8 );
504-   State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
505-   return  false ;
501+   return  true ;
506502}
507503
508504static  bool  RetCC_HexagonVector (unsigned  ValNo, MVT ValVT,
@@ -513,7 +509,6 @@ static bool RetCC_HexagonVector(unsigned ValNo, MVT ValVT,
513509  bool  UseHVX = HST.useHVXOps ();
514510  bool  UseHVXDbl = HST.useHVXDblOps ();
515511
516-   unsigned  OffSiz = 64 ;
517512  if  (LocVT == MVT::v16i32) {
518513    if  (unsigned  Reg = State.AllocateReg (Hexagon::V0)) {
519514      State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
@@ -525,18 +520,14 @@ static bool RetCC_HexagonVector(unsigned ValNo, MVT ValVT,
525520      State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
526521      return  false ;
527522    }
528-     OffSiz = 128 ;
529523  } else  if  (LocVT == MVT::v64i32) {
530524    if  (unsigned  Reg = State.AllocateReg (Hexagon::W0)) {
531525      State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
532526      return  false ;
533527    }
534-     OffSiz = 256 ;
535528  }
536529
537-   unsigned  Offset = State.AllocateStack (OffSiz, OffSiz);
538-   State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
539-   return  false ;
530+   return  true ;
540531}
541532
542533void  HexagonTargetLowering::promoteLdStType (MVT VT, MVT PromotedLdStVT) {
@@ -592,6 +583,16 @@ static bool isHvxVectorType(MVT Ty) {
592583  }
593584}
594585
586+ bool 
587+ HexagonTargetLowering::CanLowerReturn (
588+     CallingConv::ID CallConv, MachineFunction &MF, bool  isVarArg,
589+     const  SmallVectorImpl<ISD::OutputArg> &Outs,
590+     LLVMContext &Context) const  {
591+   SmallVector<CCValAssign, 16 > RVLocs;
592+   CCState CCInfo (CallConv, isVarArg, MF, RVLocs, Context);
593+   return  CCInfo.CheckReturn (Outs, RetCC_Hexagon);
594+ }
595+ 
595596//  LowerReturn - Lower ISD::RET. If a struct is larger than 8 bytes and is
596597//  passed by value, the function prototype is modified to return void and
597598//  the value is stored in memory pointed by a pointer passed by caller.
0 commit comments