[WinEH] Require token linkage in EH pad/ret signatures

Summary:
WinEHPrepare is going to require that cleanuppad and catchpad produce values
of token type which are consumed by any cleanupret or catchret exiting the
pad.  This change updates the signatures of those operators to require/enforce
that the type produced by the pads is token type and that the rets have an
appropriate argument.

The catchpad argument of a `CatchReturnInst` must be a `CatchPadInst` (and
similarly for `CleanupReturnInst`/`CleanupPadInst`).  To accommodate that
restriction, this change adds a notion of an operator constraint to both
LLParser and BitcodeReader, allowing appropriate sentinels to be constructed
for forward references and appropriate error messages to be emitted for
illegal inputs.

Also add a verifier rule (noted in LangRef) that a catchpad with a catchpad
predecessor must have no other predecessors; this ensures that WinEHPrepare
will see the expected linear relationship between sibling catches on the
same try.

Lastly, remove some superfluous/vestigial casts from instruction operand
setters operating on BasicBlocks.

Reviewers: rnk, majnemer

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D12108

llvm-svn: 245797
diff --git a/llvm/test/CodeGen/WinEH/wineh-demotion.ll b/llvm/test/CodeGen/WinEH/wineh-demotion.ll
index c44df66..113d950 100644
--- a/llvm/test/CodeGen/WinEH/wineh-demotion.ll
+++ b/llvm/test/CodeGen/WinEH/wineh-demotion.ll
@@ -36,14 +36,14 @@
   ; CHECK: merge:
   ; CHECK-NOT: = phi
   %phi = phi i32 [ %x, %left ], [ %y, %right ]
-  %cp = catchpad token [] to label %catch unwind label %catchend
+  %cp = catchpad [] to label %catch unwind label %catchend
 
 catch:
   ; CHECK: catch:
   ; CHECK: [[Reload:%[^ ]+]] = load i32, i32* [[Slot]]
   ; CHECK-NEXT: call void @h(i32 [[Reload]])
   call void @h(i32 %phi)
-  catchret token %cp to label %exit
+  catchret %cp to label %exit
 
 catchend:
   catchendpad unwind to caller
@@ -75,9 +75,9 @@
 merge.inner:
   ; CHECK: merge.inner:
   ; CHECK-NOT: = phi
-  ; CHECK: catchpad token
+  ; CHECK: catchpad []
   %x = phi i32 [ 1, %left ], [ 2, %right ]
-  %cpinner = catchpad token [] to label %catch.inner unwind label %catchend.inner
+  %cpinner = catchpad [] to label %catch.inner unwind label %catchend.inner
 
 catch.inner:
   ; Need just one store here because only %y is affected
@@ -89,16 +89,16 @@
           to label %catchret.inner unwind label %merge.outer
 
 catchret.inner:
-  catchret token %cpinner to label %exit
+  catchret %cpinner to label %exit
 catchend.inner:
   catchendpad unwind label %merge.outer
 
 merge.outer:
   ; CHECK: merge.outer:
   ; CHECK-NOT: = phi
-  ; CHECK: [[CatchPad:%[^ ]+]] = catchpad token
+  ; CHECK: [[CatchPad:%[^ ]+]] = catchpad []
   %y = phi i32 [ %x, %catchend.inner ], [ %z, %catch.inner ]
-  %cpouter = catchpad token [] to label %catch.outer unwind label %catchend.outer
+  %cpouter = catchpad [] to label %catch.outer unwind label %catchend.outer
 
 catchend.outer:
   catchendpad unwind to caller
@@ -109,10 +109,10 @@
   ; CHECK: catch.outer:
   ; CHECK-DAG: load i32, i32* [[Slot1]]
   ; CHECK-DAG: load i32, i32* [[Slot2]]
-  ; CHECK: catchret token [[CatchPad]] to label
+  ; CHECK: catchret [[CatchPad]] to label
   call void @h(i32 %x)
   call void @h(i32 %y)
-  catchret token %cpouter to label %exit
+  catchret %cpouter to label %exit
 
 exit:
   ret void
@@ -131,7 +131,7 @@
           to label %exit unwind label %catchpad
 
 catchpad:
-  %cp = catchpad token [] to label %catch unwind label %catchend
+  %cp = catchpad [] to label %catch unwind label %catchend
 
 catch:
   ; Need to reload %B here
@@ -152,7 +152,7 @@
   ; CHECK:   %phi = phi i32 [ [[ReloadX]], %left ]
   %phi = phi i32 [ %x, %left ], [ 42, %right ]
   call void @h(i32 %phi)
-  catchret token %cp to label %exit
+  catchret %cp to label %exit
 
 catchend:
   catchendpad unwind to caller
@@ -188,11 +188,11 @@
           to label %join unwind label %catchpad.inner
 catchpad.inner:
    ; CHECK: catchpad.inner:
-   ; CHECK-NEXT: catchpad token
+   ; CHECK-NEXT: catchpad []
    %phi.inner = phi i32 [ %l, %left ], [ %r, %right ]
-   %cp1 = catchpad token [] to label %catch.inner unwind label %catchend.inner
+   %cp1 = catchpad [] to label %catch.inner unwind label %catchend.inner
 catch.inner:
-   catchret token %cp1 to label %join
+   catchret %cp1 to label %join
 catchend.inner:
    catchendpad unwind label  %catchpad.outer
 join:
@@ -205,15 +205,15 @@
            to label %exit unwind label %catchpad.outer
 catchpad.outer:
    ; CHECK: catchpad.outer:
-   ; CHECK-NEXT: catchpad token
+   ; CHECK-NEXT: catchpad []
    %phi.outer = phi i32 [ %phi.inner, %catchend.inner ], [ %j, %join ]
-   %cp2 = catchpad token [] to label %catch.outer unwind label %catchend.outer
+   %cp2 = catchpad [] to label %catch.outer unwind label %catchend.outer
 catch.outer:
    ; CHECK: catch.outer:
    ; CHECK:   [[Reload:%[^ ]+]] = load i32, i32* [[Slot]]
    ; CHECK:   call void @h(i32 [[Reload]])
    call void @h(i32 %phi.outer)
-   catchret token %cp2 to label %exit
+   catchret %cp2 to label %exit
 catchend.outer:
    catchendpad unwind to caller
 exit:
@@ -241,10 +241,10 @@
 cleanup:
   ; cleanup phi can be loaded at cleanup entry
   ; CHECK: cleanup:
-  ; CHECK-NEXT: cleanuppad token
+  ; CHECK-NEXT: cleanuppad []
   ; CHECK: [[CleanupReload:%[^ ]+]] = load i32, i32* [[CleanupSlot]]
   %phi.cleanup = phi i32 [ 1, %entry ], [ 2, %invoke.cont ]
-  %cp = cleanuppad token []
+  %cp = cleanuppad []
   %b = call i1 @i()
   br i1 %b, label %left, label %right
 
@@ -264,8 +264,8 @@
   ; need store for %phi.catch
   ; CHECK:      merge:
   ; CHECK-NEXT:   store i32 [[CleanupReload]], i32* [[CatchSlot:%[^ ]+]]
-  ; CHECK-NEXT:   cleanupret token
-  cleanupret token %cp unwind label %catchpad
+  ; CHECK-NEXT:   cleanupret
+  cleanupret %cp unwind label %catchpad
 
 invoke.cont2:
   ; need store for %phi.catch
@@ -277,16 +277,16 @@
 
 catchpad:
   ; CHECK: catchpad:
-  ; CHECK-NEXT: catchpad token
+  ; CHECK-NEXT: catchpad []
   %phi.catch = phi i32 [ %phi.cleanup, %merge ], [ 3, %invoke.cont2 ]
-  %cp2 = catchpad token [] to label %catch unwind label %catchend
+  %cp2 = catchpad [] to label %catch unwind label %catchend
 
 catch:
   ; CHECK: catch:
   ; CHECK:   [[CatchReload:%[^ ]+]] = load i32, i32* [[CatchSlot]]
   ; CHECK:   call void @h(i32 [[CatchReload]]
   call void @h(i32 %phi.catch)
-  catchret token %cp2 to label %exit
+  catchret %cp2 to label %exit
 
 catchend:
   catchendpad unwind to caller
@@ -310,8 +310,8 @@
   ; CHECK: store i32 %x, i32* [[SpillSlot:%[^ ]+]]
   ; CHECK: br label %loop
 to_caller:
-  %cp1 = cleanuppad token []
-  cleanupret token %cp1 unwind to caller
+  %cp1 = cleanuppad []
+  cleanupret %cp1 unwind to caller
 loop:
   invoke void @f()
           to label %loop unwind label %cleanup
@@ -319,9 +319,9 @@
   ; CHECK: cleanup:
   ; CHECK:   [[Load:%[^ ]+]] = load i32, i32* [[SpillSlot]]
   ; CHECK:   call void @h(i32 [[Load]])
-  %cp2 = cleanuppad token []
+  %cp2 = cleanuppad []
   call void @h(i32 %x)
-  cleanupret token %cp2 unwind to caller
+  cleanupret %cp2 unwind to caller
 }
 
 ; CHECK-LABEL: @test7(
@@ -343,9 +343,9 @@
 catchpad:
   ; %x phi should be eliminated
   ; CHECK: catchpad:
-  ; CHECK-NEXT: %[[CatchPad:[^ ]+]] = catchpad token
+  ; CHECK-NEXT: %[[CatchPad:[^ ]+]] = catchpad []
   %x = phi i32 [ 1, %entry ], [ 2, %invoke.cont ]
-  %cp = catchpad token [] to label %catch unwind label %catchend
+  %cp = catchpad [] to label %catch unwind label %catchend
 catch:
   %b = call i1 @i()
   br i1 %b, label %left, label %right
@@ -353,8 +353,8 @@
   ; Edge from %left to %join needs to be split so that
   ; the load of %x can be inserted *after* the catchret
   ; CHECK: left:
-  ; CHECK-NEXT: catchret token %[[CatchPad]] to label %[[SplitLeft:[^ ]+]]
-  catchret token %cp to label %join
+  ; CHECK-NEXT: catchret %[[CatchPad]] to label %[[SplitLeft:[^ ]+]]
+  catchret %cp to label %join
   ; CHECK: [[SplitLeft]]:
   ; CHECK:   [[LoadX:%[^ ]+]] = load i32, i32* [[SlotX]]
   ; CHECK:   br label %join
@@ -363,9 +363,9 @@
   ; the load of %y can be inserted *after* the catchret
   ; CHECK: right:
   ; CHECK:   store i32 %y, i32* [[SlotY:%[^ ]+]]
-  ; CHECK:   catchret token %[[CatchPad]] to label %[[SplitRight:[^ ]+]]
+  ; CHECK:   catchret %[[CatchPad]] to label %[[SplitRight:[^ ]+]]
   %y = call i32 @g()
-  catchret token %cp to label %join
+  catchret %cp to label %join
   ; CHECK: [[SplitRight]]:
   ; CHECK:   [[LoadY:%[^ ]+]] = load i32, i32* [[SlotY]]
   ; CHECK:   br label %join
@@ -392,20 +392,20 @@
   ret void
 
 cleanup1:
-  ; CHECK: [[CleanupPad1:%[^ ]+]] = cleanuppad token
+  ; CHECK: [[CleanupPad1:%[^ ]+]] = cleanuppad []
   ; CHECK-NEXT: call void @f()
-  ; CHECK-NEXT: cleanupret token [[CleanupPad1]]
-  %cp0 = cleanuppad token []
+  ; CHECK-NEXT: cleanupret [[CleanupPad1]]
+  %cp0 = cleanuppad []
   br label %cleanupexit
 
 cleanup2:
-  ; CHECK: cleanuppad token
+  ; CHECK: cleanuppad []
   ; CHECK-NEXT: call void @f()
   ; CHECK-NEXT: unreachable
-  %cp1 = cleanuppad token []
+  %cp1 = cleanuppad []
   br label %cleanupexit
 
 cleanupexit:
   call void @f()
-  cleanupret token %cp0 unwind label %cleanup2
+  cleanupret %cp0 unwind label %cleanup2
 }
diff --git a/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll b/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll
index 84b56fe..fcbb8bd 100644
--- a/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll
+++ b/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll
@@ -37,7 +37,7 @@
           to label %unreachable.for.entry unwind label %catch.dispatch
 
 catch.dispatch:                                   ; preds = %entry
-  %1 = catchpad token [i8* null, i8* null] to label %catch unwind label %catchendblock
+  %1 = catchpad [i8* null, i8* null] to label %catch unwind label %catchendblock
 
 catch:                                            ; preds = %catch.dispatch
   ; CHECK: catch:
@@ -47,7 +47,7 @@
           to label %unreachable unwind label %catch.dispatch.1
 
 catch.dispatch.1:                                 ; preds = %catch
-  %2 = catchpad token [i8* null, i8* null] to label %catch.3 unwind label %catchendblock.2
+  %2 = catchpad [i8* null, i8* null] to label %catch.3 unwind label %catchendblock.2
 
 catch.3:                                          ; preds = %catch.dispatch.1
   ; CHECK: catch.3:
@@ -57,7 +57,7 @@
           to label %invoke.cont unwind label %catchendblock.2
 
 invoke.cont:                                      ; preds = %catch.3
-  catchret token %2 to label %try.cont
+  catchret %2 to label %try.cont
 
 try.cont:                                         ; preds = %invoke.cont
   ; CHECK: try.cont: