Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s | FileCheck %s
      2 ;
      3 ; PR27612. The following spill is hoisted from two locations: the fall
      4 ; through succ block and the landingpad block of a call which may throw
      5 ; exception. If it is not hoisted before the call, the spill will be
      6 ; missing on the landingpad path.
      7 ;
      8 ; CHECK-LABEL: _Z3foov:
      9 ; CHECK: movq  %rbx, (%rsp)          # 8-byte Spill
     10 ; CHECK-NEXT: callq _Z3goov
     11 
     12 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
     13 target triple = "x86_64-unknown-linux-gnu"
     14 
     15 @a = global [20 x i64] zeroinitializer, align 16
     16 @_ZTIi = external constant i8*
     17 
     18 ; Function Attrs: uwtable
     19 define void @_Z3foov() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
     20 entry:
     21   %tmp = load i64, i64* getelementptr inbounds ([20 x i64], [20 x i64]* @a, i64 0, i64 1), align 8
     22   invoke void @_Z3goov()
     23           to label %try.cont unwind label %lpad
     24 
     25 lpad:                                             ; preds = %entry
     26   %tmp1 = landingpad { i8*, i32 }
     27           cleanup
     28           catch i8* bitcast (i8** @_ZTIi to i8*)
     29   %tmp2 = extractvalue { i8*, i32 } %tmp1, 1
     30   %tmp3 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
     31   %matches = icmp eq i32 %tmp2, %tmp3
     32   br i1 %matches, label %catch, label %ehcleanup
     33 
     34 catch:                                            ; preds = %lpad
     35   %tmp4 = extractvalue { i8*, i32 } %tmp1, 0
     36   %tmp5 = tail call i8* @__cxa_begin_catch(i8* %tmp4)
     37   store i64 %tmp, i64* getelementptr inbounds ([20 x i64], [20 x i64]* @a, i64 0, i64 2), align 16
     38   tail call void asm sideeffect "", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{memory},~{dirflag},~{fpsr},~{flags}"()
     39   store i64 %tmp, i64* getelementptr inbounds ([20 x i64], [20 x i64]* @a, i64 0, i64 3), align 8
     40   tail call void @__cxa_end_catch()
     41   br label %try.cont
     42 
     43 try.cont:                                         ; preds = %catch, %entry
     44   store i64 %tmp, i64* getelementptr inbounds ([20 x i64], [20 x i64]* @a, i64 0, i64 4), align 16
     45   tail call void asm sideeffect "", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{memory},~{dirflag},~{fpsr},~{flags}"()
     46   store i64 %tmp, i64* getelementptr inbounds ([20 x i64], [20 x i64]* @a, i64 0, i64 5), align 8
     47   ret void
     48 
     49 ehcleanup:                                        ; preds = %lpad
     50   resume { i8*, i32 } %tmp1
     51 }
     52 
     53 declare void @_Z3goov()
     54 
     55 declare i32 @__gxx_personality_v0(...)
     56 
     57 ; Function Attrs: nounwind readnone
     58 declare i32 @llvm.eh.typeid.for(i8*)
     59 
     60 declare i8* @__cxa_begin_catch(i8*)
     61 
     62 declare void @__cxa_end_catch()
     63