Fwiw, FastISel is only used for -O0, maybe the right way to "fix" the breakage is to not use -O0 ?
On Sat, Feb 07, 2015 at 04:57:33PM +0000, Dimitry Andric wrote: > Author: dim > Date: Sat Feb 7 16:57:32 2015 > New Revision: 278361 > URL: https://svnweb.freebsd.org/changeset/base/278361 > > Log: > Back out r278349 and r278350 for now, since this apparently blows up the > kernel build in sys/dev/hptmv/hptproc.c for some people. > > Reported by: sbruno, Matthew Fuller <fulle...@over-yonder.net> > > Deleted: > head/contrib/llvm/patches/patch-32-llvm-r224884-invalid-reg-replacement.diff > Modified: > head/contrib/llvm/lib/Target/X86/X86FastISel.cpp > > Modified: head/contrib/llvm/lib/Target/X86/X86FastISel.cpp > ============================================================================== > --- head/contrib/llvm/lib/Target/X86/X86FastISel.cpp Sat Feb 7 14:31:51 > 2015 (r278360) > +++ head/contrib/llvm/lib/Target/X86/X86FastISel.cpp Sat Feb 7 16:57:32 > 2015 (r278361) > @@ -2699,9 +2699,6 @@ bool X86FastISel::FastLowerCall(CallLowe > TM.Options.GuaranteedTailCallOpt)) > return false; > > - SmallVector<MVT, 16> OutVTs; > - SmallVector<unsigned, 16> ArgRegs; > - > // If this is a constant i1/i8/i16 argument, promote to i32 to avoid an > extra > // instruction. This is safe because it is common to all FastISel supported > // calling conventions on x86. > @@ -2719,34 +2716,28 @@ bool X86FastISel::FastLowerCall(CallLowe > > // Passing bools around ends up doing a trunc to i1 and passing it. > // Codegen this as an argument + "and 1". > - MVT VT; > - auto *TI = dyn_cast<TruncInst>(Val); > - unsigned ResultReg; > - if (TI && TI->getType()->isIntegerTy(1) && CLI.CS && > - (TI->getParent() == CLI.CS->getInstruction()->getParent()) && > - TI->hasOneUse()) { > - Value *PrevVal = TI->getOperand(0); > - ResultReg = getRegForValue(PrevVal); > - > - if (!ResultReg) > - return false; > + if (auto *TI = dyn_cast<TruncInst>(Val)) { > + if (TI->getType()->isIntegerTy(1) && CLI.CS && > + (TI->getParent() == CLI.CS->getInstruction()->getParent()) && > + TI->hasOneUse()) { > + Val = cast<TruncInst>(Val)->getOperand(0); > + unsigned ResultReg = getRegForValue(Val); > > - if (!isTypeLegal(PrevVal->getType(), VT)) > - return false; > + if (!ResultReg) > + return false; > > - ResultReg = > - FastEmit_ri(VT, VT, ISD::AND, ResultReg, hasTrivialKill(PrevVal), 1); > + MVT ArgVT; > + if (!isTypeLegal(Val->getType(), ArgVT)) > + return false; > > - if (!ResultReg) > - return false; > - } else { > - if (!isTypeLegal(Val->getType(), VT)) > - return false; > - ResultReg = getRegForValue(Val); > - } > + ResultReg = > + FastEmit_ri(ArgVT, ArgVT, ISD::AND, ResultReg, Val->hasOneUse(), > 1); > > - ArgRegs.push_back(ResultReg); > - OutVTs.push_back(VT); > + if (!ResultReg) > + return false; > + UpdateValueMap(Val, ResultReg); > + } > + } > } > > // Analyze operands of the call, assigning locations to each operand. > @@ -2758,6 +2749,13 @@ bool X86FastISel::FastLowerCall(CallLowe > if (IsWin64) > CCInfo.AllocateStack(32, 8); > > + SmallVector<MVT, 16> OutVTs; > + for (auto *Val : OutVals) { > + MVT VT; > + if (!isTypeLegal(Val->getType(), VT)) > + return false; > + OutVTs.push_back(VT); > + } > CCInfo.AnalyzeCallOperands(OutVTs, OutFlags, CC_X86); > > // Get a count of how many bytes are to be pushed on the stack. > @@ -2779,7 +2777,9 @@ bool X86FastISel::FastLowerCall(CallLowe > if (ArgVT == MVT::x86mmx) > return false; > > - unsigned ArgReg = ArgRegs[VA.getValNo()]; > + unsigned ArgReg = getRegForValue(ArgVal); > + if (!ArgReg) > + return false; > > // Promote the value if needed. > switch (VA.getLocInfo()) { _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"