| ; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu | FileCheck %s --check-prefixes=CHECK,CHECKN |
| ; RUN: llc -O2 < %s -mtriple=aarch64-linux-gnu -mattr=strict-align | FileCheck %s --check-prefixes=CHECK,CHECKS |
| |
| declare i32 @bcmp(i8*, i8*, i64) nounwind readonly |
| declare i32 @memcmp(i8*, i8*, i64) nounwind readonly |
| |
| define i1 @test_b2(i8* %s1, i8* %s2) { |
| entry: |
| %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15) |
| %ret = icmp eq i32 %bcmp, 0 |
| ret i1 %ret |
| |
| ; CHECK-LABEL: test_b2: |
| ; CHECKN-NOT: bl bcmp |
| ; CHECKN: ldr x |
| ; CHECKN-NEXT: ldr x |
| ; CHECKN-NEXT: ldur x |
| ; CHECKN-NEXT: ldur x |
| ; CHECKS: bl bcmp |
| } |
| |
| define i1 @test_b2_align8(i8* align 8 %s1, i8* align 8 %s2) { |
| entry: |
| %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15) |
| %ret = icmp eq i32 %bcmp, 0 |
| ret i1 %ret |
| |
| ; CHECK-LABEL: test_b2_align8: |
| ; CHECKN-NOT: bl bcmp |
| ; CHECKN: ldr x |
| ; CHECKN-NEXT: ldr x |
| ; CHECKN-NEXT: ldur x |
| ; CHECKN-NEXT: ldur x |
| ; TODO: Four loads should be within the limit, but the heuristic isn't implemented. |
| ; CHECKS: bl bcmp |
| } |
| |
| define i1 @test_bs(i8* %s1, i8* %s2) optsize { |
| entry: |
| %memcmp = call i32 @memcmp(i8* %s1, i8* %s2, i64 31) |
| %ret = icmp eq i32 %memcmp, 0 |
| ret i1 %ret |
| |
| ; CHECK-LABEL: test_bs: |
| ; CHECKN-NOT: bl memcmp |
| ; CHECKN: ldp x |
| ; CHECKN-NEXT: ldp x |
| ; CHECKN-NEXT: ldr x |
| ; CHECKN-NEXT: ldr x |
| ; CHECKN-NEXT: ldur x |
| ; CHECKN-NEXT: ldur x |
| ; CHECKS: bl memcmp |
| } |