@@ -1731,15 +1731,17 @@ bool X86FastISel::X86SelectBranch(const Instruction *I) {
17311731 unsigned OpReg = getRegForValue (BI->getCondition ());
17321732 if (OpReg == 0 ) return false ;
17331733
1734- // In case OpReg is a K register, kortest against itself.
1735- if (MRI.getRegClass (OpReg) == &X86::VK1RegClass)
1736- BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::KORTESTWrr))
1737- .addReg (OpReg)
1738- .addReg (OpReg);
1739- else
1740- BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
1741- .addReg (OpReg)
1742- .addImm (1 );
1734+ // In case OpReg is a K register, COPY to a GPR
1735+ if (MRI.getRegClass (OpReg) == &X86::VK1RegClass) {
1736+ unsigned KOpReg = OpReg;
1737+ OpReg = createResultReg (&X86::GR8RegClass);
1738+ BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc,
1739+ TII.get (TargetOpcode::COPY), OpReg)
1740+ .addReg (KOpReg);
1741+ }
1742+ BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
1743+ .addReg (OpReg)
1744+ .addImm (1 );
17431745 BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::JNE_1))
17441746 .addMBB (TrueMBB);
17451747 finishCondBranch (BI->getParent (), TrueMBB, FalseMBB);
@@ -2073,16 +2075,17 @@ bool X86FastISel::X86FastEmitCMoveSelect(MVT RetVT, const Instruction *I) {
20732075 return false ;
20742076 bool CondIsKill = hasTrivialKill (Cond);
20752077
2076- // In case OpReg is a K register, kortest against itself.
2077- if (MRI.getRegClass (CondReg) == &X86::VK1RegClass)
2078+ // In case OpReg is a K register, COPY to a GPR
2079+ if (MRI.getRegClass (CondReg) == &X86::VK1RegClass) {
2080+ unsigned KCondReg = CondReg;
2081+ CondReg = createResultReg (&X86::GR8RegClass);
20782082 BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc,
2079- TII.get (X86::KORTESTWrr))
2080- .addReg (CondReg, getKillRegState (CondIsKill))
2081- .addReg (CondReg);
2082- else
2083- BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
2084- .addReg (CondReg, getKillRegState (CondIsKill))
2085- .addImm (1 );
2083+ TII.get (TargetOpcode::COPY), CondReg)
2084+ .addReg (KCondReg, getKillRegState (CondIsKill));
2085+ }
2086+ BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
2087+ .addReg (CondReg, getKillRegState (CondIsKill))
2088+ .addImm (1 );
20862089 }
20872090
20882091 const Value *LHS = I->getOperand (1 );
@@ -2254,16 +2257,17 @@ bool X86FastISel::X86FastEmitPseudoSelect(MVT RetVT, const Instruction *I) {
22542257 return false ;
22552258 bool CondIsKill = hasTrivialKill (Cond);
22562259
2257- // In case OpReg is a K register, kortest against itself.
2258- if (MRI.getRegClass (CondReg) == &X86::VK1RegClass)
2260+ // In case OpReg is a K register, COPY to a GPR
2261+ if (MRI.getRegClass (CondReg) == &X86::VK1RegClass) {
2262+ unsigned KCondReg = CondReg;
2263+ CondReg = createResultReg (&X86::GR8RegClass);
22592264 BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc,
2260- TII.get (X86::KORTESTWrr))
2261- .addReg (CondReg, getKillRegState (CondIsKill))
2262- .addReg (CondReg);
2263- else
2264- BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
2265- .addReg (CondReg, getKillRegState (CondIsKill))
2266- .addImm (1 );
2265+ TII.get (TargetOpcode::COPY), CondReg)
2266+ .addReg (KCondReg, getKillRegState (CondIsKill));
2267+ }
2268+ BuildMI (*FuncInfo.MBB , FuncInfo.InsertPt , DbgLoc, TII.get (X86::TEST8ri))
2269+ .addReg (CondReg, getKillRegState (CondIsKill))
2270+ .addImm (1 );
22672271 }
22682272
22692273 const Value *LHS = I->getOperand (1 );
0 commit comments