// FIXME: This should just be implemented as a patch to // X86TargetAsmInfo.cpp, then everyone will benefit. bool RaiseAsmPass::runOnInstruction(Module &M, Instruction *I) { // We can just raise inline assembler using calls CallInst *ci = dyn_cast<CallInst>(I); if (!ci) return false; InlineAsm *ia = dyn_cast<InlineAsm>(ci->getCalledValue()); if (!ia) return false; // Try to use existing infrastructure if (!TLI) return false; if (TLI->ExpandInlineAsm(ci)) return true; if (triple.getArch() == llvm::Triple::x86_64 && triple.getOS() == llvm::Triple::Linux) { if (ia->getAsmString() == "" && ia->hasSideEffects()) { #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3) IRBuilder<> Builder(I); Builder.CreateFence(llvm::SequentiallyConsistent); #endif I->eraseFromParent(); return true; } } return false; }