aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/lib
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-02-07 16:57:32 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-02-07 16:57:32 +0000
commit57fd0bcf035457e8a77962ce33e2951c5310a0d7 (patch)
tree59e4079560ab70cc9ca1dffb1bff26401df9a68d /contrib/llvm/lib
parent2a0ed0760c9f6a7753d0e997ad4f0ec1c67bc220 (diff)
downloadsrc-57fd0bcf035457e8a77962ce33e2951c5310a0d7.tar.gz
src-57fd0bcf035457e8a77962ce33e2951c5310a0d7.zip
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 <fullermd@over-yonder.net>
Notes
Notes: svn path=/head/; revision=278361
Diffstat (limited to 'contrib/llvm/lib')
-rw-r--r--contrib/llvm/lib/Target/X86/X86FastISel.cpp56
1 files changed, 28 insertions, 28 deletions
diff --git a/contrib/llvm/lib/Target/X86/X86FastISel.cpp b/contrib/llvm/lib/Target/X86/X86FastISel.cpp
index 14084c6013f3..ae3eea4943d7 100644
--- a/contrib/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/contrib/llvm/lib/Target/X86/X86FastISel.cpp
@@ -2699,9 +2699,6 @@ bool X86FastISel::FastLowerCall(CallLoweringInfo &CLI) {
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(CallLoweringInfo &CLI) {
// 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 (!ResultReg)
+ return false;
- if (!isTypeLegal(PrevVal->getType(), VT))
- return false;
+ MVT ArgVT;
+ if (!isTypeLegal(Val->getType(), ArgVT))
+ return false;
- ResultReg =
- FastEmit_ri(VT, VT, ISD::AND, ResultReg, hasTrivialKill(PrevVal), 1);
+ ResultReg =
+ FastEmit_ri(ArgVT, ArgVT, ISD::AND, ResultReg, Val->hasOneUse(), 1);
- if (!ResultReg)
- return false;
- } else {
- if (!isTypeLegal(Val->getType(), VT))
- return false;
- ResultReg = getRegForValue(Val);
+ if (!ResultReg)
+ return false;
+ UpdateValueMap(Val, ResultReg);
+ }
}
-
- ArgRegs.push_back(ResultReg);
- OutVTs.push_back(VT);
}
// Analyze operands of the call, assigning locations to each operand.
@@ -2758,6 +2749,13 @@ bool X86FastISel::FastLowerCall(CallLoweringInfo &CLI) {
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(CallLoweringInfo &CLI) {
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()) {