[PATCH] D46560: [SelectionDAG] Don't crash on inline assembly errors when the inline assembly return type is a struct.

Phabricator via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 19 21:36:53 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL335093: [SelectionDAG] Don't crash on inline assembly errors when the inline assembly… (authored by ctopper, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D46560?vs=145589&id=152020#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D46560

Files:
  llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/trunk/test/CodeGen/X86/pr37359.ll


Index: llvm/trunk/test/CodeGen/X86/pr37359.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/pr37359.ll
+++ llvm/trunk/test/CodeGen/X86/pr37359.ll
@@ -0,0 +1,17 @@
+; RUN: not llc -o /dev/null %s 2>&1 | FileCheck %s
+target triple = "x86_64--"
+
+ at a = global i32 0, align 4
+
+; CHECK: error: couldn't allocate input reg for constraint 'x'
+define i32 @main() {
+entry:
+  %0 = load i32, i32* @a, align 4
+  %cmp = icmp ne i32 %0, 0
+  %1 = call { i32, i32 } asm "", "={ax},={dx},x,~{dirflag},~{fpsr},~{flags}"(i1 %cmp)
+  %asmresult = extractvalue { i32, i32 } %1, 0
+  %asmresult1 = extractvalue { i32, i32 } %1, 1
+  store i32 %asmresult, i32* @a, align 4
+  store i32 %asmresult1, i32* @a, align 4
+  ret i32 0
+}
Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -7741,8 +7741,17 @@
 
   // Make sure we leave the DAG in a valid state
   const TargetLowering &TLI = DAG.getTargetLoweringInfo();
-  auto VT = TLI.getValueType(DAG.getDataLayout(), CS.getType());
-  setValue(CS.getInstruction(), DAG.getUNDEF(VT));
+  SmallVector<EVT, 1> ValueVTs;
+  ComputeValueVTs(TLI, DAG.getDataLayout(), CS->getType(), ValueVTs);
+
+  if (ValueVTs.empty())
+    return;
+
+  SmallVector<SDValue, 1> Ops;
+  for (unsigned i = 0, e = ValueVTs.size(); i != e; ++i)
+    Ops.push_back(DAG.getUNDEF(ValueVTs[i]));
+
+  setValue(CS.getInstruction(), DAG.getMergeValues(Ops, getCurSDLoc()));
 }
 
 void SelectionDAGBuilder::visitVAStart(const CallInst &I) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46560.152020.patch
Type: text/x-patch
Size: 1712 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180620/4b598f5e/attachment.bin>


More information about the llvm-commits mailing list