summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2016-02-20 23:09:44 +0000
committerDan Gohman <dan433584@gmail.com>2016-02-20 23:09:44 +0000
commit02c0871abddfefee897eb8732d9f6422b02509a9 (patch)
treec0f5d0743e81b56d92376bd74b3ec573ce16a21a
parentbef47f0b8312f854a127c1611bb9549eb960efcb (diff)
downloadbcm5719-llvm-02c0871abddfefee897eb8732d9f6422b02509a9.tar.gz
bcm5719-llvm-02c0871abddfefee897eb8732d9f6422b02509a9.zip
[WebAssembly] Handle CopyToReg nodes with flag results in LowerCopyToReg.
llvm-svn: 261457
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp10
-rw-r--r--llvm/test/CodeGen/WebAssembly/userstack.ll12
2 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index 7b3649b5a09..8f94f305c8a 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -558,16 +558,20 @@ SDValue WebAssemblyTargetLowering::LowerCopyToReg(SDValue Op,
// need to insert some kind of instruction that can take an FI operand and
// produces a value usable by CopyToReg (i.e. in a vreg). So insert a dummy
// copy_local between Op and its FI operand.
+ SDValue Chain = Op.getOperand(0);
SDLoc DL(Op);
+ unsigned Reg = cast<RegisterSDNode>(Op.getOperand(1))->getReg();
EVT VT = Src.getValueType();
SDValue Copy(
DAG.getMachineNode(VT == MVT::i32 ? WebAssembly::COPY_LOCAL_I32
: WebAssembly::COPY_LOCAL_I64,
DL, VT, Src),
0);
- return DAG.getCopyToReg(Op.getOperand(0), DL,
- cast<RegisterSDNode>(Op.getOperand(1))->getReg(),
- Copy);
+ return Op.getNode()->getNumValues() == 1
+ ? DAG.getCopyToReg(Chain, DL, Reg, Copy)
+ : DAG.getCopyToReg(Chain, DL, Reg, Copy, Op.getNumOperands() == 4
+ ? Op.getOperand(3)
+ : SDValue());
}
return SDValue();
}
diff --git a/llvm/test/CodeGen/WebAssembly/userstack.ll b/llvm/test/CodeGen/WebAssembly/userstack.ll
index f4f9e1c9fa7..69cc03813de 100644
--- a/llvm/test/CodeGen/WebAssembly/userstack.ll
+++ b/llvm/test/CodeGen/WebAssembly/userstack.ll
@@ -217,4 +217,16 @@ define void @frameaddress_1() {
ret void
}
+; Test a stack address passed to an inline asm.
+; CHECK-LABEL: inline_asm:
+; CHECK: __stack_pointer
+; CHECK: #APP
+; CHECK-NEXT: # %{{[0-9]+}}{{$}}
+; CHECK-NEXT: #NO_APP
+define void @inline_asm() {
+ %tmp = alloca i8
+ call void asm sideeffect "# %0", "r"(i8* %tmp)
+ ret void
+}
+
; TODO: test over-aligned alloca
OpenPOWER on IntegriCloud