[AArch64]Enable the narrow ld promotion only on profitable microarchitectures
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-ldr-merge.ll
1 ; RUN: llc < %s -march=arm64 -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s
2
3 ; CHECK-LABEL: Ldrh_merge
4 ; CHECK-NOT: ldrh
5 ; CHECK: ldr [[NEW_DEST:w[0-9]+]]
6 ; CHECK: and w{{[0-9]+}}, [[NEW_DEST]], #0xffff
7 ; CHECK: lsr  w{{[0-9]+}}, [[NEW_DEST]]
8 define i16 @Ldrh_merge(i16* nocapture readonly %p) {
9   %1 = load i16, i16* %p, align 2
10   %arrayidx2 = getelementptr inbounds i16, i16* %p, i64 1
11   %2 = load i16, i16* %arrayidx2, align 2
12   %add = add nuw nsw i16 %1, %2
13   ret i16 %add
14 }
15
16 ; CHECK-LABEL: Ldurh_merge
17 ; CHECK-NOT: ldurh
18 ; CHECK: ldur [[NEW_DEST:w[0-9]+]]
19 ; CHECK: and w{{[0-9]+}}, [[NEW_DEST]], #0xffff
20 ; CHECK: lsr  w{{[0-9]+}}, [[NEW_DEST]]
21 define i16 @Ldurh_merge(i16* nocapture readonly %p)  {
22 entry:
23   %arrayidx = getelementptr inbounds i16, i16* %p, i64 -2
24   %0 = load i16, i16* %arrayidx
25   %arrayidx3 = getelementptr inbounds i16, i16* %p, i64 -1
26   %1 = load i16, i16* %arrayidx3
27   %add = add nuw nsw i16 %0, %1
28   ret i16 %add
29 }
30
31 ; CHECK-LABEL: Ldrh_4_merge
32 ; CHECK-NOT: ldrh
33 ; CHECK: ldp [[NEW_DEST:w[0-9]+]]
34 define i16 @Ldrh_4_merge(i16* nocapture readonly %P) {
35   %arrayidx = getelementptr inbounds i16, i16* %P, i64 0
36   %l0 = load i16, i16* %arrayidx
37   %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 1
38   %l1 = load i16, i16* %arrayidx2
39   %arrayidx7 = getelementptr inbounds i16, i16* %P, i64 2
40   %l2 = load i16, i16* %arrayidx7
41   %arrayidx12 = getelementptr inbounds i16, i16* %P, i64 3
42   %l3 = load i16, i16* %arrayidx12
43   %add4 = add nuw nsw i16 %l1, %l0
44   %add9 = add nuw nsw i16 %add4, %l2
45   %add14 = add nuw nsw i16 %add9, %l3
46   ret i16 %add14
47 }