Inline asm's were still introducing bogus dependencies;
authorDale Johannesen <dalej@apple.com>
Sat, 18 Apr 2009 00:09:40 +0000 (00:09 +0000)
committerDale Johannesen <dalej@apple.com>
Sat, 18 Apr 2009 00:09:40 +0000 (00:09 +0000)
my earlier patch to this code only fixed half of it.

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

lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp

index 5204113b3aa058deb040dbbc48af0c6e257f4d26..b20f061e03c080762a7c7f827927cd8afcdb23fc 100644 (file)
@@ -5111,7 +5111,9 @@ void SelectionDAGLowering::visitInlineAsm(CallSite CS) {
   /// ConstraintOperands - Information about all of the constraints.
   std::vector<SDISelAsmOperandInfo> ConstraintOperands;
 
-  SDValue Chain = getRoot();
+  // We won't need to flush pending loads if this asm doesn't touch
+  // memory and is nonvolatile.
+  SDValue Chain = IA->hasSideEffects() ? getRoot() : DAG.getRoot();
   SDValue Flag;
 
   std::set<unsigned> OutputRegs, InputRegs;
@@ -5122,6 +5124,10 @@ void SelectionDAGLowering::visitInlineAsm(CallSite CS) {
     ConstraintInfos = IA->ParseConstraints();
 
   bool hasMemory = hasInlineAsmMemConstraint(ConstraintInfos, TLI);
+  // Flush pending loads if this touches memory (includes clobbering it).
+  // It's possible this is overly conservative.
+  if (hasMemory)
+    Chain = getRoot();
 
   unsigned ArgNo = 0;   // ArgNo - The argument of the CallInst.
   unsigned ResNo = 0;   // ResNo - The result number of the next output.