forked from OSchip/llvm-project
118 lines
3.0 KiB
Plaintext
118 lines
3.0 KiB
Plaintext
|
# RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu \
|
||
|
# RUN: -start-before aarch64-speculation-hardening -o - %s \
|
||
|
# RUN: | FileCheck %s --dump-input-on-failure
|
||
|
|
||
|
# Check that the speculation hardening pass generates code as expected for
|
||
|
# basic blocks ending with a variety of branch patterns:
|
||
|
# - (1) no branches (fallthrough)
|
||
|
# - (2) one unconditional branch
|
||
|
# - (3) one conditional branch + fall-through
|
||
|
# - (4) one conditional branch + one unconditional branch
|
||
|
# - other direct branches don't seem to be generated by the AArch64 codegen
|
||
|
--- |
|
||
|
define void @nobranch_fallthrough(i32 %a, i32 %b) speculative_load_hardening {
|
||
|
ret void
|
||
|
}
|
||
|
define void @uncondbranch(i32 %a, i32 %b) speculative_load_hardening {
|
||
|
ret void
|
||
|
}
|
||
|
define void @condbranch_fallthrough(i32 %a, i32 %b) speculative_load_hardening {
|
||
|
ret void
|
||
|
}
|
||
|
define void @condbranch_uncondbranch(i32 %a, i32 %b) speculative_load_hardening {
|
||
|
ret void
|
||
|
}
|
||
|
define void @indirectbranch(i32 %a, i32 %b) speculative_load_hardening {
|
||
|
ret void
|
||
|
}
|
||
|
...
|
||
|
---
|
||
|
name: nobranch_fallthrough
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
; CHECK-LABEL: nobranch_fallthrough
|
||
|
bb.0:
|
||
|
successors: %bb.1
|
||
|
liveins: $w0, $w1
|
||
|
; CHECK-NOT: csel
|
||
|
bb.1:
|
||
|
liveins: $w0
|
||
|
RET undef $lr, implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: uncondbranch
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
; CHECK-LABEL: uncondbranch
|
||
|
bb.0:
|
||
|
successors: %bb.1
|
||
|
liveins: $w0, $w1
|
||
|
B %bb.1
|
||
|
; CHECK-NOT: csel
|
||
|
bb.1:
|
||
|
liveins: $w0
|
||
|
RET undef $lr, implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: condbranch_fallthrough
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
; CHECK-LABEL: condbranch_fallthrough
|
||
|
bb.0:
|
||
|
successors: %bb.1, %bb.2
|
||
|
liveins: $w0, $w1
|
||
|
$wzr = SUBSWrs renamable $w0, renamable $w1, 0, implicit-def $nzcv, implicit-def $nzcv
|
||
|
Bcc 11, %bb.2, implicit $nzcv
|
||
|
; CHECK: b.lt [[BB_LT_T:\.LBB[0-9_]+]]
|
||
|
|
||
|
bb.1:
|
||
|
liveins: $nzcv, $w0
|
||
|
; CHECK: csel x16, x16, xzr, ge
|
||
|
RET undef $lr, implicit $w0
|
||
|
bb.2:
|
||
|
liveins: $nzcv, $w0
|
||
|
; CHECK: csel x16, x16, xzr, lt
|
||
|
RET undef $lr, implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: condbranch_uncondbranch
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
; CHECK-LABEL: condbranch_uncondbranch
|
||
|
bb.0:
|
||
|
successors: %bb.1, %bb.2
|
||
|
liveins: $w0, $w1
|
||
|
$wzr = SUBSWrs renamable $w0, renamable $w1, 0, implicit-def $nzcv, implicit-def $nzcv
|
||
|
Bcc 11, %bb.2, implicit $nzcv
|
||
|
B %bb.1, implicit $nzcv
|
||
|
; CHECK: b.lt [[BB_LT_T:\.LBB[0-9_]+]]
|
||
|
|
||
|
bb.1:
|
||
|
liveins: $nzcv, $w0
|
||
|
; CHECK: csel x16, x16, xzr, ge
|
||
|
RET undef $lr, implicit $w0
|
||
|
bb.2:
|
||
|
liveins: $nzcv, $w0
|
||
|
; CHECK: csel x16, x16, xzr, lt
|
||
|
RET undef $lr, implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: indirectbranch
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
; Check that no instrumentation is done on indirect branches (for now).
|
||
|
; CHECK-LABEL: indirectbranch
|
||
|
bb.0:
|
||
|
successors: %bb.1, %bb.2
|
||
|
liveins: $x0
|
||
|
BR $x0
|
||
|
bb.1:
|
||
|
liveins: $x0
|
||
|
; CHECK-NOT: csel
|
||
|
RET undef $lr, implicit $x0
|
||
|
bb.2:
|
||
|
liveins: $x0
|
||
|
; CHECK-NOT: csel
|
||
|
RET undef $lr, implicit $x0
|
||
|
...
|