81 lines · plain
1; RUN: llc -mtriple=aarch64-none-linux-gnu -enable-machine-outliner < %s | FileCheck %s --check-prefix=BTI2; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -enable-machine-outliner < %s | \3; RUN: FileCheck %s --check-prefix=BTI4; RUN: llc -mtriple=aarch64-none-linux-gnu -fast-isel -enable-machine-outliner < %s | \5; RUN: FileCheck %s --check-prefix=BTI6; RUN: llc -mtriple=aarch64-none-linux-gnu -enable-machine-outliner -mattr=+no-bti-at-return-twice < %s | \7; RUN: FileCheck %s --check-prefix=NOBTI8; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -enable-machine-outliner -mattr=+no-bti-at-return-twice < %s | \9; RUN: FileCheck %s --check-prefix=NOBTI10; RUN: llc -mtriple=aarch64-none-linux-gnu -fast-isel -enable-machine-outliner -mattr=+no-bti-at-return-twice < %s | \11; RUN: FileCheck %s --check-prefix=NOBTI12 13; Check that the outliner does not split up the call to setjmp and the bti after it.14; When we do not insert a bti, it is allowed to move the setjmp call into an outlined function.15 16; C source17; --------18; extern int setjmp(ptr);19;20; int f(int a, int b, int c, int d) {21; setjmp(0);22; return 1 + a * (a + b) / (c + d);23; }24;25; int g(int a, int b, int c, int d) {26; setjmp(0);27; return 2 + a * (a + b) / (c + d);28; }29 30define i32 @f(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 {31; BTI-LABEL: f:32; BTI: bl OUTLINED_FUNCTION_133; BTI-NEXT: bl setjmp34; BTI-NEXT: hint #3635; BTI-NEXT: bl OUTLINED_FUNCTION_036 37; NOBTI: f:38; NOBTI: bl OUTLINED_FUNCTION_039; NOBTI-NEXT: bl OUTLINED_FUNCTION_140 41entry:42 %call = call i32 @setjmp(ptr noundef null) #143 %add = add nsw i32 %b, %a44 %mul = mul nsw i32 %add, %a45 %add1 = add nsw i32 %d, %c46 %div = sdiv i32 %mul, %add147 %add2 = add nsw i32 %div, 148 ret i32 %add249}50 51declare i32 @setjmp(ptr noundef) #052 53define i32 @g(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 {54; BTI-LABEL: g:55; BTI: bl OUTLINED_FUNCTION_156; BTI-NEXT: bl setjmp57; BTI-NEXT: hint #3658; BTI-NEXT: bl OUTLINED_FUNCTION_059 60; NOBTI: g:61; NOBTI: bl OUTLINED_FUNCTION_062; NOBTI-NEXT: bl OUTLINED_FUNCTION_163 64entry:65 %call = call i32 @setjmp(ptr noundef null) #166 %add = add nsw i32 %b, %a67 %mul = mul nsw i32 %add, %a68 %add1 = add nsw i32 %d, %c69 %div = sdiv i32 %mul, %add170 %add2 = add nsw i32 %div, 271 ret i32 %add272}73 74; NOBTI-LABEL: OUTLINED_FUNCTION_0:75; NOBTI: b setjmp76; NOBTI: OUTLINED_FUNCTION_1:77; NOBTI-LABEL: ret78 79attributes #0 = { "branch-target-enforcement" }80attributes #1 = { returns_twice }81