OSDN Git Service

Fix PR3522. It's not safe to sink into landing pad BB's.
authorEvan Cheng <evan.cheng@apple.com>
Sun, 15 Feb 2009 08:36:12 +0000 (08:36 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sun, 15 Feb 2009 08:36:12 +0000 (08:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64582 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineSink.cpp
test/CodeGen/X86/pr3522.ll [new file with mode: 0644]

index a85a41f..468bd01 100644 (file)
@@ -212,6 +212,11 @@ bool MachineSinking::SinkInstruction(MachineInstr *MI, bool &SawStore) {
   // If there are no outputs, it must have side-effects.
   if (SuccToSinkTo == 0)
     return false;
+
+  // It's not safe to sink instructions to EH landing pad. Control flow into
+  // landing pad is implicitly defined.
+  if (SuccToSinkTo->isLandingPad())
+    return false;
   
   DEBUG(cerr << "Sink instr " << *MI);
   DEBUG(cerr << "to block " << *SuccToSinkTo);
diff --git a/test/CodeGen/X86/pr3522.ll b/test/CodeGen/X86/pr3522.ll
new file mode 100644 (file)
index 0000000..f743700
--- /dev/null
@@ -0,0 +1,30 @@
+; RUN: llvm-as < %s | llc -march=x86 -stats |& not grep machine-sink
+; PR3522
+
+target triple = "i386-pc-linux-gnu"
+@.str = external constant [13 x i8]            ; <[13 x i8]*> [#uses=1]
+
+define void @_ada_c34018a() {
+entry:
+       %0 = tail call i32 @report__ident_int(i32 90)           ; <i32> [#uses=1]
+       %1 = trunc i32 %0 to i8         ; <i8> [#uses=1]
+       invoke void @__gnat_rcheck_12(i8* getelementptr ([13 x i8]* @.str, i32 0, i32 0), i32 32) noreturn
+                       to label %invcont unwind label %lpad
+
+invcont:               ; preds = %entry
+       unreachable
+
+bb22:          ; preds = %lpad
+       ret void
+
+return:                ; preds = %lpad
+       ret void
+
+lpad:          ; preds = %entry
+       %2 = icmp eq i8 %1, 90          ; <i1> [#uses=1]
+       br i1 %2, label %return, label %bb22
+}
+
+declare void @__gnat_rcheck_12(i8*, i32) noreturn
+
+declare i32 @report__ident_int(i32)