This patch addresses a problem with the Post RA scheduler generating an
authorPreston Gurd <preston.gurd@intel.com>
Mon, 29 Oct 2012 15:01:23 +0000 (15:01 +0000)
committerPreston Gurd <preston.gurd@intel.com>
Mon, 29 Oct 2012 15:01:23 +0000 (15:01 +0000)
incorrect instruction sequence due to it not being aware that an
inline assembly instruction may reference memory.

This patch fixes the problem by causing the scheduler to always assume that any
inline assembly code instruction could access memory. This is necessary because
the internal representation of the inline instruction does not include
any information about memory accesses.

This should fix PR13504.

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

lib/CodeGen/ScheduleDAGInstrs.cpp
test/CodeGen/X86/inlineasm-sched-bug.ll [new file with mode: 0644]

index 496473d3a4b2a639287954d1aebee846cf8d803c..8ea0f8a3eacc7bd182e72d84c472ed0c3673ed16 100644 (file)
@@ -420,6 +420,11 @@ void ScheduleDAGInstrs::addVRegUseDeps(SUnit *SU, unsigned OperIdx) {
 /// Return true if MI is an instruction we are unable to reason about
 /// (like a call or something with unmodeled side effects).
 static inline bool isGlobalMemoryObject(AliasAnalysis *AA, MachineInstr *MI) {
+  if (MI->isInlineAsm()) {
+    // Until we can tell if an inline assembly instruction accesses
+    // memory, we must assume all such instructions do so.
+    return true;
+  }
   if (MI->isCall() || MI->hasUnmodeledSideEffects() ||
       (MI->hasOrderedMemoryRef() &&
        (!MI->mayLoad() || !MI->isInvariantLoad(AA))))
diff --git a/test/CodeGen/X86/inlineasm-sched-bug.ll b/test/CodeGen/X86/inlineasm-sched-bug.ll
new file mode 100644 (file)
index 0000000..08de0c0
--- /dev/null
@@ -0,0 +1,13 @@
+; PR13504
+; RUN: llc -march=x86 -mcpu=atom <%s | FileCheck %s
+; CHECK: bsfl
+; CHECK-NOT: movl
+
+define i32 @foo(i32 %treemap) nounwind uwtable {
+entry:
+  %sub = sub i32 0, %treemap
+  %and = and i32 %treemap, %sub
+  %0 = tail call i32 asm "bsfl $1,$0\0A\09", "=r,rm,~{dirflag},~{fpsr},~{flags}"(i32 %and) nounwind
+  ret i32 %0
+}
+