| ; RUN: llc -march=hexagon < %s | FileCheck %s | 
 |  | 
 | target triple = "hexagon" | 
 | %type.0 = type { i32, i8**, i32, i32, i32 } | 
 |  | 
 | ; Check that CFI is before the packet with call+allocframe. | 
 | ; CHECK-LABEL: danny: | 
 | ; CHECK: cfi_def_cfa | 
 | ; CHECK: call throw | 
 | ; CHECK-NEXT: allocframe | 
 |  | 
 | ; Expect packet: | 
 | ; { | 
 | ;   call throw | 
 | ;   allocframe(#0) | 
 | ; } | 
 |  | 
 | define i8* @danny(%type.0* %p0, i32 %p1) #0 { | 
 | entry: | 
 |   %t0 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 4 | 
 |   %t1 = load i32, i32* %t0, align 4 | 
 |   %th = icmp ugt i32 %t1, %p1 | 
 |   br i1 %th, label %if.end, label %if.then | 
 |  | 
 | if.then:                                          ; preds = %entry | 
 |   tail call void @throw(%type.0* nonnull %p0) | 
 |   unreachable | 
 |  | 
 | if.end:                                           ; preds = %entry | 
 |   %t6 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 3 | 
 |   %t2 = load i32, i32* %t6, align 4 | 
 |   %t9 = add i32 %t2, %p1 | 
 |   %ta = lshr i32 %t9, 4 | 
 |   %tb = and i32 %t9, 15 | 
 |   %t7 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 2 | 
 |   %t3 = load i32, i32* %t7, align 4 | 
 |   %tc = icmp ult i32 %ta, %t3 | 
 |   %td = select i1 %tc, i32 0, i32 %t3 | 
 |   %te = sub i32 %ta, %td | 
 |   %t8 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 1 | 
 |   %t4 = load i8**, i8*** %t8, align 4 | 
 |   %tf = getelementptr inbounds i8*, i8** %t4, i32 %te | 
 |   %t5 = load i8*, i8** %tf, align 4 | 
 |   %tg = getelementptr inbounds i8, i8* %t5, i32 %tb | 
 |   ret i8* %tg | 
 | } | 
 |  | 
 | ; Check that CFI is after allocframe. | 
 | ; CHECK-LABEL: sammy: | 
 | ; CHECK: allocframe | 
 | ; CHECK: cfi_def_cfa | 
 |  | 
 | define void @sammy(%type.0* %p0, i32 %p1) #0 { | 
 | entry: | 
 |   %t0 = icmp sgt i32 %p1, 0 | 
 |   br i1 %t0, label %if.then, label %if.else | 
 | if.then: | 
 |   call void @throw(%type.0* nonnull %p0) | 
 |   br label %if.end | 
 | if.else: | 
 |   call void @nothrow() #2 | 
 |   br label %if.end | 
 | if.end: | 
 |   ret void | 
 | } | 
 |  | 
 | declare void @throw(%type.0*) #1 | 
 | declare void @nothrow() #2 | 
 |  | 
 | attributes #0 = { "target-cpu"="hexagonv55" } | 
 | attributes #1 = { noreturn "target-cpu"="hexagonv55" } | 
 | attributes #2 = { nounwind "target-cpu"="hexagonv55" } |