[PATCH] [NVPTX] Check if callsite is defined when computing argument allignment

Jacques Pienaar jpienaar at google.com
Tue Apr 21 12:52:00 PDT 2015


Hi jingyue, eliben,

In getArgumentAlignment check if the ImmutableCallSite pointer CS is non-null before dereferencing. If CS is 0x0 fall back to the ABI type alignment else compute the alignment as before.

http://reviews.llvm.org/D9168

Files:
  lib/Target/NVPTX/NVPTXISelLowering.cpp

Index: lib/Target/NVPTX/NVPTXISelLowering.cpp
===================================================================
--- lib/Target/NVPTX/NVPTXISelLowering.cpp
+++ lib/Target/NVPTX/NVPTXISelLowering.cpp
@@ -987,43 +987,46 @@
                                           Type *Ty,
                                           unsigned Idx) const {
   const DataLayout *TD = getDataLayout();
-  unsigned Align = 0;
-  const Value *DirectCallee = CS->getCalledFunction();
 
-  if (!DirectCallee) {
-    // We don't have a direct function symbol, but that may be because of
-    // constant cast instructions in the call.
-    const Instruction *CalleeI = CS->getInstruction();
-    assert(CalleeI && "Call target is not a function or derived value?");
-
-    // With bitcast'd call targets, the instruction will be the call
-    if (isa<CallInst>(CalleeI)) {
-      // Check if we have call alignment metadata
-      if (llvm::getAlign(*cast<CallInst>(CalleeI), Idx, Align))
-        return Align;
-
-      const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue();
-      // Ignore any bitcast instructions
-      while(isa<ConstantExpr>(CalleeV)) {
-        const ConstantExpr *CE = cast<ConstantExpr>(CalleeV);
-        if (!CE->isCast())
-          break;
-        // Look through the bitcast
-        CalleeV = cast<ConstantExpr>(CalleeV)->getOperand(0);
+  if (CS) {
+    unsigned Align = 0;
+    const Value *DirectCallee = CS->getCalledFunction();
+
+    if (!DirectCallee) {
+      // We don't have a direct function symbol, but that may be because of
+      // constant cast instructions in the call.
+      const Instruction *CalleeI = CS->getInstruction();
+      assert(CalleeI && "Call target is not a function or derived value?");
+
+      // With bitcast'd call targets, the instruction will be the call
+      if (isa<CallInst>(CalleeI)) {
+        // Check if we have call alignment metadata
+        if (llvm::getAlign(*cast<CallInst>(CalleeI), Idx, Align))
+          return Align;
+
+        const Value *CalleeV = cast<CallInst>(CalleeI)->getCalledValue();
+        // Ignore any bitcast instructions
+        while(isa<ConstantExpr>(CalleeV)) {
+          const ConstantExpr *CE = cast<ConstantExpr>(CalleeV);
+          if (!CE->isCast())
+            break;
+          // Look through the bitcast
+          CalleeV = cast<ConstantExpr>(CalleeV)->getOperand(0);
+        }
+
+        // We have now looked past all of the bitcasts.  Do we finally have a
+        // Function?
+        if (isa<Function>(CalleeV))
+          DirectCallee = CalleeV;
       }
-
-      // We have now looked past all of the bitcasts.  Do we finally have a
-      // Function?
-      if (isa<Function>(CalleeV))
-        DirectCallee = CalleeV;
     }
-  }
 
-  // Check for function alignment information if we found that the
-  // ultimate target is a Function
-  if (DirectCallee)
-    if (llvm::getAlign(*cast<Function>(DirectCallee), Idx, Align))
-      return Align;
+    // Check for function alignment information if we found that the
+    // ultimate target is a Function
+    if (DirectCallee)
+      if (llvm::getAlign(*cast<Function>(DirectCallee), Idx, Align))
+        return Align;
+  }
 
   // Call is indirect or alignment information is not available, fall back to
   // the ABI type alignment

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9168.24160.patch
Type: text/x-patch
Size: 3313 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150421/c3314e1e/attachment.bin>


More information about the cfe-commits mailing list