| # RUN: llc -o - -run-pass=machine-scheduler -misched=shuffle %s | FileCheck %s |
| # RUN: llc -o - -run-pass=postmisched %s | FileCheck %s |
| |
| # RUN: llc -o - -passes=machine-scheduler -misched=shuffle %s | FileCheck %s |
| # RUN: llc -o - -passes=postmisched %s | FileCheck %s |
| |
| # REQUIRES: asserts |
| # -misched=shuffle is only available with assertions enabled |
| |
| # Check that instructions that are recognized as branch targets by BTI |
| # are not reordered by machine instruction schedulers. |
| |
| --- | |
| target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" |
| target triple = "aarch64-unknown-linux-gnu" |
| |
| define i32 @f_pac_pseudo(i32 %a, i32 %b, i32 %c) #0 "sign-return-address"="all" { |
| entry: |
| ret i32 0 |
| } |
| |
| define i32 @f_pac(i32 %a, i32 %b, i32 %c) #0 "sign-return-address"="all" { |
| entry: |
| ret i32 0 |
| } |
| |
| define i32 @f_bti(i32 %a, i32 %b, i32 %c) #0 { |
| entry: |
| ret i32 0 |
| } |
| |
| define i32 @f_brk(i32 %a, i32 %b, i32 %c) #0 { |
| entry: |
| ret i32 0 |
| } |
| |
| define i32 @f_hlt(i32 %a, i32 %b, i32 %c) #0 { |
| entry: |
| ret i32 0 |
| } |
| |
| define i32 @f_nop(i32 %a, i32 %b, i32 %c) #0 { |
| entry: |
| ret i32 0 |
| } |
| |
| attributes #0 = { nounwind memory(none) "target-features"="+v8.2a" } |
| |
| ... |
| --- |
| name: f_pac_pseudo |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit $lr, implicit $sp |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # PAUTH_EPILOGUE instruction is omitted for simplicity as it is technically possible |
| # to move it, so it may end up at a less obvious position in a basic block. |
| |
| # CHECK-LABEL: name: f_pac_pseudo |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit {{.*}}$lr, implicit $sp |
| # CHECK-NEXT: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-NEXT: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |
| --- |
| name: f_pac |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| frame-setup PACIASP implicit-def $lr, implicit $lr, implicit $sp |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # AUTIASP is omitted, see above. |
| |
| # CHECK-LABEL: name: f_pac |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: frame-setup PACIASP implicit-def $lr, implicit {{.*}}$lr, implicit $sp |
| # CHECK-NEXT: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-NEXT: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |
| --- |
| name: f_bti |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| HINT 34 |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # CHECK-LABEL: name: f_bti |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: HINT 34 |
| # CHECK-NEXT: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-NEXT: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |
| --- |
| name: f_brk |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| BRK 1 |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # CHECK-LABEL: name: f_brk |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: BRK 1 |
| # CHECK-NEXT: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-NEXT: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |
| --- |
| name: f_hlt |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| HLT 1 |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # CHECK-LABEL: name: f_hlt |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: HLT 1 |
| # CHECK-NEXT: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-NEXT: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |
| --- |
| name: f_nop |
| alignment: 4 |
| tracksRegLiveness: true |
| body: | |
| bb.0.entry: |
| liveins: $w0, $w1, $w2, $lr |
| |
| HINT 0 |
| $w8 = ADDWrs $w0, $w1, 0 |
| $w0 = MADDWrrr $w8, $w2, $wzr |
| RET undef $lr, implicit $w0 |
| |
| # Check that BTI-related instructions are left intact not because *anything* |
| # is left intact. |
| |
| # CHECK-LABEL: name: f_nop |
| # CHECK: body: | |
| # CHECK-NEXT: bb.0.entry: |
| # CHECK-NEXT: liveins: $w0, $w1, $w2, $lr |
| # |
| # CHECK: $w8 = ADDWrs {{.*}}$w0, {{.*}}$w1, 0 |
| # CHECK-DAG: $w0 = MADDWrrr {{.*}}$w8, {{.*}}$w2, $wzr |
| # CHECK-DAG: HINT 0 |
| # CHECK-NEXT: RET undef $lr, implicit {{.*}}$w0 |
| |
| ... |