xref: /llvm-project/llvm/test/CodeGen/ARM/setjmp-bti-basic.ll (revision 0fbb17458a01a6b388fc67661ffb92969503e977)
1; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi < %s | FileCheck %s --check-prefix=BTI
2; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+no-bti-at-return-twice < %s | \
3; RUN: FileCheck %s --check-prefix=NOBTI
4
5; C source
6; --------
7; jmp_buf buf;
8;
9; extern void bar(int x);
10;
11; int foo(int x) {
12;   if (setjmp(buf))
13;     x = 0;
14;   else
15;     bar(x);
16;   return x;
17; }
18
19@buf = global [20 x i64] zeroinitializer, align 8
20
21define i32 @foo(i32 %x) {
22; BTI-LABEL: foo:
23; BTI:       bl setjmp
24; BTI-NEXT:  bti
25; NOBTI-LABEL: foo:
26; NOBTI:       bl setjmp
27; NOBTI-NOT:   bti
28
29entry:
30  %call = call i32 @setjmp(i64* getelementptr inbounds ([20 x i64], [20 x i64]* @buf, i32 0, i32 0)) #0
31  %tobool.not = icmp eq i32 %call, 0
32  br i1 %tobool.not, label %if.else, label %if.end
33
34if.else:                                          ; preds = %entry
35  call void @bar(i32 %x)
36  br label %if.end
37
38if.end:                                           ; preds = %entry, %if.else
39  %x.addr.0 = phi i32 [ %x, %if.else ], [ 0, %entry ]
40  ret i32 %x.addr.0
41}
42
43declare void @bar(i32)
44declare i32 @setjmp(i64*) #0
45
46attributes #0 = { returns_twice }
47
48!llvm.module.flags = !{!0}
49
50!0 = !{i32 1, !"branch-target-enforcement", i32 1}
51