Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s | FileCheck %s
      2 
      3 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
      4 target triple = "x86_64-pc-windows-msvc"
      5 
      6 declare i32 @__CxxFrameHandler3(...)
      7 declare void @throw() noreturn uwtable
      8 declare i8* @getval()
      9 
     10 define i8* @reload_out_of_pad(i8* %arg) #0 personality i32 (...)* @__CxxFrameHandler3 {
     11 assertPassed:
     12   invoke void @throw()
     13           to label %unreachable unwind label %catch.dispatch
     14 
     15 catch:
     16   %cp = catchpad within %cs [i8* null, i32 0, i8* null]
     17   catchret from %cp to label %return
     18 
     19   ; This block *must* appear after the catchret to test the bug.
     20   ; FIXME: Make this an MIR test so we can control MBB layout.
     21 unreachable:
     22   unreachable
     23 
     24 catch.dispatch:
     25   %cs = catchswitch within none [label %catch] unwind to caller
     26 
     27 return:
     28   ret i8* %arg
     29 }
     30 
     31 ; CHECK-LABEL: reload_out_of_pad: # @reload_out_of_pad
     32 ; CHECK: movq %rcx, -[[arg_slot:[0-9]+]](%rbp) # 8-byte Spill
     33 ; CHECK: callq throw
     34 ; CHECK: ud2
     35 ; CHECK: movq -[[arg_slot]](%rbp), %rax # 8-byte Reload
     36 ; CHECK: retq
     37 
     38 ; CHECK: "?catch$3@?0?reload_out_of_pad@4HA":
     39 ; CHECK-NOT: Reload
     40 ; CHECK: retq
     41 
     42 define i8* @spill_in_pad() #0 personality i32 (...)* @__CxxFrameHandler3 {
     43 assertPassed:
     44   invoke void @throw()
     45           to label %unreachable unwind label %catch.dispatch
     46 
     47 catch:
     48   %cp = catchpad within %cs [i8* null, i32 0, i8* null]
     49   %val = call i8* @getval() [ "funclet"(token %cp) ]
     50   catchret from %cp to label %return
     51 
     52 unreachable:
     53   unreachable
     54 
     55 catch.dispatch:
     56   %cs = catchswitch within none [label %catch] unwind to caller
     57 
     58 return:
     59   ret i8* %val
     60 }
     61 
     62 ; CHECK-LABEL: spill_in_pad: # @spill_in_pad
     63 ; CHECK: callq throw
     64 ; CHECK: ud2
     65 ; CHECK: movq -[[val_slot:[0-9]+]](%rbp), %rax # 8-byte Reload
     66 ; CHECK: retq
     67 
     68 ; CHECK: "?catch$3@?0?spill_in_pad@4HA":
     69 ; CHECK: callq getval
     70 ; CHECK: movq %rax, -[[val_slot]](%rbp) # 8-byte Spill
     71 ; CHECK: retq
     72 
     73 attributes #0 = { uwtable }
     74