[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 f2fd7e5..27e420f 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -2878,9 +2878,8 @@
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 @@
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,
diff --git a/test/CodeGen/ms-inline-asm.c b/test/CodeGen/ms-inline-asm.c
index f54c226..ee4ca01 100644
--- a/test/CodeGen/ms-inline-asm.c
+++ b/test/CodeGen/ms-inline-asm.c
@@ -80,5 +80,5 @@
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
}