1 ; RUN: llc -march=hexagon < %s | FileCheck %s 2 3 target triple = "hexagon" 4 %type.0 = type { i32, i8**, i32, i32, i32 } 5 6 ; Check that CFI is before the packet with call+allocframe. 7 ; CHECK-LABEL: danny: 8 ; CHECK: cfi_def_cfa 9 ; CHECK: call throw 10 ; CHECK-NEXT: allocframe 11 12 ; Expect packet: 13 ; { 14 ; call throw 15 ; allocframe(#0) 16 ; } 17 18 define i8* @danny(%type.0* %p0, i32 %p1) #0 { 19 entry: 20 %t0 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 4 21 %t1 = load i32, i32* %t0, align 4 22 %th = icmp ugt i32 %t1, %p1 23 br i1 %th, label %if.end, label %if.then 24 25 if.then: ; preds = %entry 26 tail call void @throw(%type.0* nonnull %p0) 27 unreachable 28 29 if.end: ; preds = %entry 30 %t6 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 3 31 %t2 = load i32, i32* %t6, align 4 32 %t9 = add i32 %t2, %p1 33 %ta = lshr i32 %t9, 4 34 %tb = and i32 %t9, 15 35 %t7 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 2 36 %t3 = load i32, i32* %t7, align 4 37 %tc = icmp ult i32 %ta, %t3 38 %td = select i1 %tc, i32 0, i32 %t3 39 %te = sub i32 %ta, %td 40 %t8 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 1 41 %t4 = load i8**, i8*** %t8, align 4 42 %tf = getelementptr inbounds i8*, i8** %t4, i32 %te 43 %t5 = load i8*, i8** %tf, align 4 44 %tg = getelementptr inbounds i8, i8* %t5, i32 %tb 45 ret i8* %tg 46 } 47 48 ; Check that CFI is after allocframe. 49 ; CHECK-LABEL: sammy: 50 ; CHECK: allocframe 51 ; CHECK: cfi_def_cfa 52 53 define void @sammy(%type.0* %p0, i32 %p1) #0 { 54 entry: 55 %t0 = icmp sgt i32 %p1, 0 56 br i1 %t0, label %if.then, label %if.else 57 if.then: 58 call void @throw(%type.0* nonnull %p0) 59 br label %if.end 60 if.else: 61 call void @nothrow() #2 62 br label %if.end 63 if.end: 64 ret void 65 } 66 67 declare void @throw(%type.0*) #1 68 declare void @nothrow() #2 69 70 attributes #0 = { "target-cpu"="hexagonv55" } 71 attributes #1 = { noreturn "target-cpu"="hexagonv55" } 72 attributes #2 = { nounwind "target-cpu"="hexagonv55" } 73