OSDN Git Service

Fixup r364512
authorDiana Picus <diana.picus@linaro.org>
Mon, 1 Jul 2019 15:07:38 +0000 (15:07 +0000)
committerDiana Picus <diana.picus@linaro.org>
Mon, 1 Jul 2019 15:07:38 +0000 (15:07 +0000)
Fix stack-use-after-scope errors from r364512. One instance was already
fixed in r364611 - this patch simplifies that fix and addresses one more
instance of similar code.

Discussed in: https://reviews.llvm.org/D63905

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364778 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/IRTranslator.cpp

index dd0194b..443ca73 100644 (file)
@@ -1566,16 +1566,16 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
     ArrayRef<Register> Res = getOrCreateVRegs(CI);
 
     SmallVector<ArrayRef<Register>, 8> Args;
-    SmallVector<Register, 8> InVRegs;
+    Register SwiftInVReg = 0;
     Register SwiftErrorVReg = 0;
     for (auto &Arg: CI.arg_operands()) {
       if (CLI->supportSwiftError() && isSwiftError(Arg)) {
+        assert(SwiftInVReg == 0 && "Expected only one swift error argument");
         LLT Ty = getLLTForType(*Arg->getType(), *DL);
-        InVRegs.push_back(MRI->createGenericVirtualRegister(Ty));
-        MIRBuilder.buildCopy(
-            InVRegs.back(),
-            SwiftError.getOrCreateVRegUseAt(&CI, &MIRBuilder.getMBB(), Arg));
-        Args.emplace_back(llvm::makeArrayRef(InVRegs.back()));
+        SwiftInVReg = MRI->createGenericVirtualRegister(Ty);
+        MIRBuilder.buildCopy(SwiftInVReg, SwiftError.getOrCreateVRegUseAt(
+                                              &CI, &MIRBuilder.getMBB(), Arg));
+        Args.emplace_back(makeArrayRef(SwiftInVReg));
         SwiftErrorVReg =
             SwiftError.getOrCreateVRegDefAt(&CI, &MIRBuilder.getMBB(), Arg);
         continue;
@@ -1669,13 +1669,15 @@ bool IRTranslator::translateInvoke(const User &U,
     Res = getOrCreateVRegs(I);
   SmallVector<ArrayRef<Register>, 8> Args;
   Register SwiftErrorVReg = 0;
+  Register SwiftInVReg = 0;
   for (auto &Arg : I.arg_operands()) {
     if (CLI->supportSwiftError() && isSwiftError(Arg)) {
+      assert(SwiftInVReg == 0 && "Expected only one swift error argument");
       LLT Ty = getLLTForType(*Arg->getType(), *DL);
-      Register InVReg = MRI->createGenericVirtualRegister(Ty);
-      MIRBuilder.buildCopy(InVReg, SwiftError.getOrCreateVRegUseAt(
-                                       &I, &MIRBuilder.getMBB(), Arg));
-      Args.push_back(InVReg);
+      SwiftInVReg = MRI->createGenericVirtualRegister(Ty);
+      MIRBuilder.buildCopy(SwiftInVReg, SwiftError.getOrCreateVRegUseAt(
+                                            &I, &MIRBuilder.getMBB(), Arg));
+      Args.push_back(makeArrayRef(SwiftInVReg));
       SwiftErrorVReg =
           SwiftError.getOrCreateVRegDefAt(&I, &MIRBuilder.getMBB(), Arg);
       continue;