1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -O3 < %s -mtriple=aarch64 | FileCheck %s
; The seemingly redundant mov where src_reg == dst_reg shouldn't be removed,
; because it has the effect of zeroing the upper bits in x8.
define i32 @ham(i32 %arg, i1 %arg1, i1 %arg2, ptr %arg3) nounwind {
; CHECK-LABEL: ham:
; CHECK: // %bb.0: // %bb
; CHECK-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: tbnz w1, #0, .LBB0_3
; CHECK-NEXT: // %bb.1: // %bb4
; CHECK-NEXT: tbnz w2, #0, .LBB0_3
; CHECK-NEXT: // %bb.2: // %bb5
; CHECK-NEXT: mov x19, x3
; CHECK-NEXT: mov w21, w1
; CHECK-NEXT: mov w20, w0
; CHECK-NEXT: bl zot
; CHECK-NEXT: tbz w21, #0, .LBB0_4
; CHECK-NEXT: .LBB0_3: // %bb6
; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB0_4:
; CHECK-NEXT: mov w8, w20
; CHECK-NEXT: mov w20, wzr
; CHECK-NEXT: mov w8, w8
; CHECK-NEXT: mov w21, w8
; CHECK-NEXT: .LBB0_5: // %bb7
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
; CHECK-NEXT: strb w20, [x19]
; CHECK-NEXT: cbnz x21, .LBB0_5
; CHECK-NEXT: // %bb.6: // %bb8
; CHECK-NEXT: // in Loop: Header=BB0_5 Depth=1
; CHECK-NEXT: bl quux
; CHECK-NEXT: b .LBB0_5
bb:
br i1 %arg1, label %bb6, label %bb4
bb4:
%load = load ptr, ptr null, align 8
br i1 %arg2, label %bb6, label %bb5
bb5:
%call = call i32 @zot() #0
%zext = zext i32 %arg to i64
br i1 %arg1, label %bb6, label %bb7
bb6:
ret i32 0
bb7:
store i8 0, ptr %arg3, align 1
%icmp = icmp eq i64 %zext, 0
br i1 %icmp, label %bb8, label %bb7
bb8:
call void @quux()
br label %bb7
}
declare i32 @zot()
declare void @quux()
attributes #0 = { returns_twice }
|