Minor extension to llvm.experimental.patchpoint: don't require a call.
[oota-llvm.git] / lib / Target / X86 / X86MCInstLower.cpp
index c718b1cceb866963daee27f38700e894a8156ba7..5c3f9af8bf60b2d9cc30b90c9841c498e9310e8f 100644 (file)
@@ -765,6 +765,8 @@ static void LowerSTACKMAP(MCStreamer &OutStreamer,
     OutStreamer.EmitInstruction(MCInstBuilder(X86::NOOP));
 }
 
+// Lower a patchpoint of the form:
+// [<def>], <id>, <numBytes>, <target>, <numArgs>
 static void LowerPATCHPOINT(MCStreamer &OutStreamer,
                             X86MCInstLower &MCInstLowering,
                             StackMaps &SM,
@@ -813,17 +815,20 @@ static void LowerPATCHPOINT(MCStreamer &OutStreamer,
                     getStackMapEndMOP(MI.operands_begin(), MI.operands_end()),
                     isAnyRegCC && hasDef);
 
-  // Emit MOV to materialize the target address and the CALL to target.
-  // This is encoded with 12-13 bytes, depending on which register is used.
-  // We conservatively assume that it is 12 bytes and emit in worst case one
-  // extra NOP byte.
-  unsigned EncodedBytes = 12;
-  OutStreamer.EmitInstruction(MCInstBuilder(X86::MOV64ri)
-                              .addReg(MI.getOperand(ScratchIdx).getReg())
-                              .addImm(MI.getOperand(StartIdx + 2).getImm()));
-  OutStreamer.EmitInstruction(MCInstBuilder(X86::CALL64r)
-                              .addReg(MI.getOperand(ScratchIdx).getReg()));
-
+  unsigned EncodedBytes = 0;
+  int64_t CallTarget = MI.getOperand(StartIdx + 2).getImm();
+  if (CallTarget) {
+    // Emit MOV to materialize the target address and the CALL to target.
+    // This is encoded with 12-13 bytes, depending on which register is used.
+    // We conservatively assume that it is 12 bytes and emit in worst case one
+    // extra NOP byte.
+    EncodedBytes = 12;
+    OutStreamer.EmitInstruction(MCInstBuilder(X86::MOV64ri)
+                                .addReg(MI.getOperand(ScratchIdx).getReg())
+                                .addImm(CallTarget));
+    OutStreamer.EmitInstruction(MCInstBuilder(X86::CALL64r)
+                                .addReg(MI.getOperand(ScratchIdx).getReg()));
+  }
   // Emit padding.
   unsigned NumNOPBytes = MI.getOperand(StartIdx + 1).getImm();
   assert(NumNOPBytes >= EncodedBytes &&