]> granicus.if.org Git - clang/commitdiff
[ms-inline asm] Use a set container to remove redundant clobbers.
authorChad Rosier <mcrosier@apple.com>
Wed, 15 Aug 2012 21:55:19 +0000 (21:55 +0000)
committerChad Rosier <mcrosier@apple.com>
Wed, 15 Aug 2012 21:55:19 +0000 (21:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161991 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/CodeGen/ms-inline-asm.c

index f2fd7e5312283fab40c214580fe3ccddf3501449..27e420fadcb24ceb232de70942df8813a55897d2 100644 (file)
@@ -2878,9 +2878,8 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
                                 SourceLocation EndLoc) {
   // MS-style inline assembly is not fully supported, so emit a warning.
   Diag(AsmLoc, diag::warn_unsupported_msasm);
-  unsigned NumClobberRegs = 0;
   SmallVector<StringRef,4> Clobbers;
-  SmallVector<std::string,4> ClobberRegs;
+  std::set<std::string> ClobberRegs;
 
   // Empty asm statements don't need to instantiate the AsmParser, etc.
   if (AsmToks.empty()) {
@@ -2979,23 +2978,25 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
       TheTarget->createMCInstPrinter(1, *MAI, *MII, *MRI, *STI);
 
     // Build the list of clobbers.
-    ClobberRegs.resize(NumClobberRegs + Desc.getNumDefs());
     for (unsigned i = 0, e = Desc.getNumDefs(); i != e; ++i) {
       const llvm::MCOperand &Op = Inst.getOperand(i);
       if (!Op.isReg())
         continue;
 
-      llvm::raw_string_ostream OS(ClobberRegs[NumClobberRegs]);
+      std::string Reg;
+      llvm::raw_string_ostream OS(Reg);
       IP->printRegName(OS, Op.getReg());
 
       StringRef Clobber(OS.str());
       if (!Context.getTargetInfo().isValidClobber(Clobber))
         return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) <<
                          Clobber);
-      // FIXME: Asm blocks may result in redundant clobbers.
-      Clobbers.push_back(ClobberRegs[NumClobberRegs++]);
+      ClobberRegs.insert(Reg);
     }
   }
+  for (std::set<std::string>::iterator I = ClobberRegs.begin(),
+         E = ClobberRegs.end(); I != E; ++I)
+    Clobbers.push_back(*I);
 
   MSAsmStmt *NS =
     new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc,
index f54c226e6072b8ed3353c608d0b030ed4be96844..ee4ca019c73b048f95f01277757237daf32a6e39 100644 (file)
@@ -80,5 +80,5 @@ void t10() {
     pop ebx
   }
 // CHECK: t10
-// CHECK: call void asm sideeffect "push ebx\0Amov ebx, 0x07\0Apop ebx", "~{ebx},~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
+// CHECK: call void asm sideeffect "push ebx\0Amov ebx, 0x07\0Apop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
 }