| ; This test verifies that global variables are hashed based on their initial contents, |
| ; allowing them to be outlined even if they appear different due to their names. |
| |
| ; RUN: split-file %s %t |
| |
| ; The outlined function is created locally. |
| ; Note that `.str.3` is commonly used in both `f1()` and `f2()`. |
| ; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-generate -aarch64-enable-collect-loh=false \ |
| ; RUN: %t/local-two.ll -o - | FileCheck %s --check-prefix=WRITE |
| |
| ; WRITE-LABEL: _OUTLINED_FUNCTION_{{.*}}: |
| ; WRITE: adrp x1, l_.str.3 |
| ; WRITE-NEXT: add x1, x1, l_.str.3 |
| ; WRITE-NEXT: mov w2 |
| ; WRITE-NEXT: mov w3 |
| ; WRITE-NEXT: mov w4 |
| ; WRITE-NEXT: b |
| |
| ; Create an object file and merge it into the cgdata. |
| ; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-generate -aarch64-enable-collect-loh=false \ |
| ; RUN: -filetype=obj %t/local-two.ll -o %t_write_base |
| ; RUN: llvm-cgdata --merge %t_write_base -o %t_cgdata_base |
| |
| ; Read the cgdata in the machine outliner for optimistically outlining in local-one.ll. |
| ; Note that the hash of `.str.5` in local-one.ll matches that of `.str.3` in an outlined tree in the cgdata. |
| |
| ; RUN: llc -mtriple=arm64-apple-darwin -enable-machine-outliner -codegen-data-use-path=%t_cgdata_base -aarch64-enable-collect-loh=false \ |
| ; RUN: %t/local-one.ll -o - | FileCheck %s --check-prefix=READ |
| |
| ; READ-LABEL: _OUTLINED_FUNCTION_{{.*}}: |
| ; READ: adrp x1, l_.str.5 |
| ; READ-NEXT: add x1, x1, l_.str.5 |
| ; READ-NEXT: mov w2 |
| ; READ-NEXT: mov w3 |
| ; READ-NEXT: mov w4 |
| ; READ-NEXT: b |
| |
| ;--- local-two.ll |
| @.str.1 = private unnamed_addr constant [3 x i8] c"f1\00", align 1 |
| @.str.2 = private unnamed_addr constant [3 x i8] c"f2\00", align 1 |
| @.str.3 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 |
| |
| declare noundef i32 @goo(ptr noundef, ptr noundef, i32, i32, i32) |
| define i32 @f1() minsize { |
| entry: |
| %call = tail call noundef i32 @goo(ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.3, i32 1, i32 2, i32 3) |
| ret i32 %call |
| } |
| define i32 @f2() minsize { |
| entry: |
| %call = tail call noundef i32 @goo(ptr noundef nonnull @.str.2, ptr noundef nonnull @.str.3, i32 1, i32 2, i32 3) |
| ret i32 %call |
| } |
| |
| ;--- local-one.ll |
| @.str.4 = private unnamed_addr constant [3 x i8] c"f3\00", align 1 |
| @.str.5 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 |
| |
| declare noundef i32 @goo(ptr noundef, ptr noundef, i32, i32, i32) |
| define i32 @f1() minsize { |
| entry: |
| %call = tail call noundef i32 @goo(ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.5, i32 1, i32 2, i32 3) |
| ret i32 %call |
| } |