Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64-legal-i32 / mem.ll
blob456a880891f73098afcb2cfae6fbf0db4fbc9e82
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck -check-prefix=RV64I %s
5 ; Check indexed and unindexed, sext, zext and anyext loads
7 define void @lb(ptr %a, ptr %b) nounwind {
8 ; RV64I-LABEL: lb:
9 ; RV64I:       # %bb.0:
10 ; RV64I-NEXT:    lb a2, 1(a0)
11 ; RV64I-NEXT:    lbu zero, 0(a0)
12 ; RV64I-NEXT:    sw a2, 0(a1)
13 ; RV64I-NEXT:    ret
14   %1 = getelementptr i8, ptr %a, i32 1
15   %2 = load i8, ptr %1
16   %3 = sext i8 %2 to i32
17   ; the unused load will produce an anyext for selection
18   %4 = load volatile i8, ptr %a
19   store i32 %3, ptr %b
20   ret void
23 define void @lbu(ptr %a, ptr %b) nounwind {
24 ; RV64I-LABEL: lbu:
25 ; RV64I:       # %bb.0:
26 ; RV64I-NEXT:    lbu a0, 1(a0)
27 ; RV64I-NEXT:    sw a0, 0(a1)
28 ; RV64I-NEXT:    ret
29   %1 = getelementptr i8, ptr %a, i32 1
30   %2 = load i8, ptr %1
31   %3 = zext i8 %2 to i32
32   store i32 %3, ptr %b
33   ret void
36 define void @lh(ptr %a, ptr %b) nounwind {
37 ; RV64I-LABEL: lh:
38 ; RV64I:       # %bb.0:
39 ; RV64I-NEXT:    lh a2, 2(a0)
40 ; RV64I-NEXT:    lh zero, 0(a0)
41 ; RV64I-NEXT:    sw a2, 0(a1)
42 ; RV64I-NEXT:    ret
43   %1 = getelementptr i16, ptr %a, i32 1
44   %2 = load i16, ptr %1
45   %3 = sext i16 %2 to i32
46   ; the unused load will produce an anyext for selection
47   %4 = load volatile i16, ptr %a
48   store i32 %3, ptr %b
49   ret void
52 define void @lhu(ptr %a, ptr %b) nounwind {
53 ; RV64I-LABEL: lhu:
54 ; RV64I:       # %bb.0:
55 ; RV64I-NEXT:    lhu a0, 2(a0)
56 ; RV64I-NEXT:    sw a0, 0(a1)
57 ; RV64I-NEXT:    ret
58   %1 = getelementptr i16, ptr %a, i32 1
59   %2 = load i16, ptr %1
60   %3 = zext i16 %2 to i32
61   store i32 %3, ptr %b
62   ret void
65 define void @lw(ptr %a, ptr %b) nounwind {
66 ; RV64I-LABEL: lw:
67 ; RV64I:       # %bb.0:
68 ; RV64I-NEXT:    lw a2, 4(a0)
69 ; RV64I-NEXT:    lw zero, 0(a0)
70 ; RV64I-NEXT:    sd a2, 0(a1)
71 ; RV64I-NEXT:    ret
72   %1 = getelementptr i32, ptr %a, i64 1
73   %2 = load i32, ptr %1
74   %3 = sext i32 %2 to i64
75   ; the unused load will produce an anyext for selection
76   %4 = load volatile i32, ptr %a
77   store i64 %3, ptr %b
78   ret void
81 define void @lwu(ptr %a, ptr %b) nounwind {
82 ; RV64I-LABEL: lwu:
83 ; RV64I:       # %bb.0:
84 ; RV64I-NEXT:    lwu a0, 4(a0)
85 ; RV64I-NEXT:    sd a0, 0(a1)
86 ; RV64I-NEXT:    ret
87   %1 = getelementptr i32, ptr %a, i64 1
88   %2 = load i32, ptr %1
89   %3 = zext i32 %2 to i64
90   store i64 %3, ptr %b
91   ret void