90 lines · plain
1; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -enable-machine-outliner < %s | \2; RUN: FileCheck %s --check-prefix=BTI3; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -enable-machine-outliner -mattr=+no-bti-at-return-twice < %s | FileCheck %s --check-prefix=NOBTI4 5; C source6; --------7; jmp_buf buf;8;9; extern void h(int a, int b, int *c);10;11; int f(int a, int b, int c, int d) {12; if (setjmp(buf) != 0)13; return -1;14; h(a, b, &a);15; return 2 + a * (a + b) / (c + d);16; }17;18; int g(int a, int b, int c, int d) {19; if (setjmp(buf) != 0)20; return -1;21; h(a, b, &a);22; return 1 + a * (a + b) / (c + d);23; }24 25@buf = global [20 x i64] zeroinitializer, align 826 27define i32 @f(i32 %a, i32 %b, i32 %c, i32 %d) "branch-target-enforcement" {28; BTI-LABEL: f:29; BTI: bl OUTLINED_FUNCTION_030; BTI-NEXT: bti31; NOBTI-LABEL: f:32; NOBTI: bl OUTLINED_FUNCTION_033; NOBTI-NEXT: cbz r0, .LBB0_234entry:35 %a.addr = alloca i32, align 436 store i32 %a, ptr %a.addr, align 437 %call = call i32 @setjmp(ptr @buf) #038 %cmp.not = icmp eq i32 %call, 039 br i1 %cmp.not, label %if.end, label %return40 41if.end: ; preds = %entry42 call void @h(i32 %a, i32 %b, ptr nonnull %a.addr)43 %0 = load i32, ptr %a.addr, align 444 %add = add nsw i32 %0, %b45 %mul = mul nsw i32 %add, %046 %add1 = add nsw i32 %d, %c47 %div = sdiv i32 %mul, %add148 %add2 = add nsw i32 %div, 249 br label %return50 51return: ; preds = %entry, %if.end52 %retval.0 = phi i32 [ %add2, %if.end ], [ -1, %entry ]53 ret i32 %retval.054}55 56define i32 @g(i32 %a, i32 %b, i32 %c, i32 %d) "branch-target-enforcement" {57; BTI-LABEL: g:58; BTI: bl OUTLINED_FUNCTION_059; BTI-NEXT: bti60; NOBTI-LABEL: g:61; NOBTI: bl OUTLINED_FUNCTION_062; NOBTI-NEXT: cbz r0, .LBB1_263entry:64 %a.addr = alloca i32, align 465 store i32 %a, ptr %a.addr, align 466 %call = call i32 @setjmp(ptr @buf) #067 %cmp.not = icmp eq i32 %call, 068 br i1 %cmp.not, label %if.end, label %return69 70if.end: ; preds = %entry71 call void @h(i32 %a, i32 %b, ptr nonnull %a.addr)72 %0 = load i32, ptr %a.addr, align 473 %add = add nsw i32 %0, %b74 %mul = mul nsw i32 %add, %075 %add1 = add nsw i32 %d, %c76 %div = sdiv i32 %mul, %add177 %add2 = add nsw i32 %div, 178 br label %return79 80return: ; preds = %entry, %if.end81 %retval.0 = phi i32 [ %add2, %if.end ], [ -1, %entry ]82 ret i32 %retval.083}84 85declare void @h(i32, i32, ptr)86declare i32 @setjmp(ptr) #087 88attributes #0 = { returns_twice }89 90