OSDN Git Service

[WebAssembly] Handle CopyToReg nodes with flag results in LowerCopyToReg.
authorDan Gohman <dan433584@gmail.com>
Sat, 20 Feb 2016 23:09:44 +0000 (23:09 +0000)
committerDan Gohman <dan433584@gmail.com>
Sat, 20 Feb 2016 23:09:44 +0000 (23:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@261457 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
test/CodeGen/WebAssembly/userstack.ll

index 7b3649b..8f94f30 100644 (file)
@@ -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();
 }
index f4f9e1c..69cc038 100644 (file)
@@ -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