After a custom inserter, in a block which has constant instructions,
authorDan Gohman <gohman@apple.com>
Mon, 19 Jul 2010 22:48:56 +0000 (22:48 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 19 Jul 2010 22:48:56 +0000 (22:48 +0000)
update the current basic block in addition to the current insert
position, so that they remain consistent. This fixes rdar://8204072.

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

lib/CodeGen/SelectionDAG/FastISel.cpp
test/CodeGen/X86/fast-isel-atomic.ll [new file with mode: 0644]

index cff7ace536a0500f505887bd471362929dda36be..1fb20f1dc06aed0482291ebd5781b7669f8588bd 100644 (file)
@@ -276,6 +276,7 @@ std::pair<unsigned, bool> FastISel::getRegForGEPIndex(const Value *Idx) {
 void FastISel::recomputeInsertPt() {
   if (getLastLocalValue()) {
     FuncInfo.InsertPt = getLastLocalValue();
+    FuncInfo.MBB = FuncInfo.InsertPt->getParent();
     ++FuncInfo.InsertPt;
   } else
     FuncInfo.InsertPt = FuncInfo.MBB->getFirstNonPHI();
diff --git a/test/CodeGen/X86/fast-isel-atomic.ll b/test/CodeGen/X86/fast-isel-atomic.ll
new file mode 100644 (file)
index 0000000..f8eee9c
--- /dev/null
@@ -0,0 +1,16 @@
+; RUN: llc < %s -O0 -march=x86-64
+; rdar://8204072
+
+@sc = external global i8
+@uc = external global i8
+
+declare i8 @llvm.atomic.load.and.i8.p0i8(i8* nocapture, i8) nounwind
+
+define void @test_fetch_and_op() nounwind {
+entry:
+  %tmp40 = call i8 @llvm.atomic.load.and.i8.p0i8(i8* @sc, i8 11) ; <i8> [#uses=1]
+  store i8 %tmp40, i8* @sc
+  %tmp41 = call i8 @llvm.atomic.load.and.i8.p0i8(i8* @uc, i8 11) ; <i8> [#uses=1]
+  store i8 %tmp41, i8* @uc
+  ret void
+}