1 ; RUN: llc < %s -march=arm64 -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s
3 ; CHECK-LABEL: Ldrh_merge
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
16 ; CHECK-LABEL: Ldurh_merge
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) {
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
31 ; CHECK-LABEL: Ldrh_4_merge
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