brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 0487816 Raw
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