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 +, 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
>
> 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 OutVTs;
> - SmallVector 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(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(Val)) {
> + if (TI->getType()->isIntegerTy(1) && CLI.CS &&
> + (TI->getParent() == CLI.CS->getInstruction()->getParent()) &&
> + TI->hasOneUse()) {
> +Val = cast(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 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-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"