From: Chad Rosier Date: Wed, 15 Aug 2012 21:55:19 +0000 (+0000) Subject: [ms-inline asm] Use a set container to remove redundant clobbers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b5f9eb8a0709082bba8e8de3a6c643928570aaa0;p=clang [ms-inline asm] Use a set container to remove redundant clobbers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161991 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index f2fd7e5312..27e420fadc 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -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 Clobbers; - SmallVector ClobberRegs; + std::set 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::iterator I = ClobberRegs.begin(), + E = ClobberRegs.end(); I != E; ++I) + Clobbers.push_back(*I); MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, diff --git a/test/CodeGen/ms-inline-asm.c b/test/CodeGen/ms-inline-asm.c index f54c226e60..ee4ca019c7 100644 --- a/test/CodeGen/ms-inline-asm.c +++ b/test/CodeGen/ms-inline-asm.c @@ -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 }