1; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu                     | FileCheck %s --check-prefixes=CHECK,CHECKN
2; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu -mattr=strict-align | FileCheck %s --check-prefixes=CHECK,CHECKS
3
4declare i32 @bcmp(i8*, i8*, i64) nounwind readonly
5declare i32 @memcmp(i8*, i8*, i64) nounwind readonly
6
7define i1 @test_b2(i8* %s1, i8* %s2) {
8entry:
9  %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15)
10  %ret = icmp eq i32 %bcmp, 0
11  ret i1 %ret
12
13; CHECK-LABEL: test_b2:
14; CHECK-NOT:   bl bcmp
15; CHECKN:      ldr  x
16; CHECKN-NEXT: ldr  x
17; CHECKN-NEXT: ldur x
18; CHECKN-NEXT: ldur x
19; CHECKS-COUNT-30: ldrb w
20}
21
22define i1 @test_b2_align8(i8* align 8 %s1, i8* align 8 %s2) {
23entry:
24  %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15)
25  %ret = icmp eq i32 %bcmp, 0
26  ret i1 %ret
27
28; CHECK-LABEL: test_b2_align8:
29; CHECK-NOT:   bl bcmp
30; CHECKN:      ldr  x
31; CHECKN-NEXT: ldr  x
32; CHECKN-NEXT: ldur x
33; CHECKN-NEXT: ldur x
34; CHECKS:      ldr  x
35; CHECKS-NEXT: ldr  x
36; CHECKS-NEXT: ldr  w
37; CHECKS-NEXT: ldr  w
38; CHECKS-NEXT: ldrh  w
39; CHECKS-NEXT: ldrh  w
40; CHECKS-NEXT: ldrb  w
41; CHECKS-NEXT: ldrb  w
42}
43
44define i1 @test_bs(i8* %s1, i8* %s2) optsize {
45entry:
46  %memcmp = call i32 @memcmp(i8* %s1, i8* %s2, i64 31)
47  %ret = icmp eq i32 %memcmp, 0
48  ret i1 %ret
49
50; CHECK-LABEL: test_bs:
51; CHECKN-NOT:  bl memcmp
52; CHECKN:      ldp  x
53; CHECKN-NEXT: ldp  x
54; CHECKN-NEXT: ldr  x
55; CHECKN-NEXT: ldr  x
56; CHECKN-NEXT: ldur x
57; CHECKN-NEXT: ldur x
58; CHECKS:      bl memcmp
59}
60