xref: /llvm-project/llvm/test/Transforms/GVN/rle-clobbering-store.ll (revision 9f12f655c44faf47e5c42c016b543cc431b66af8)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2; RUN: opt < %s -passes=gvn -S | FileCheck %s
3
4define i1 @test_i1(ptr %a, ptr %b, ptr %c) {
5; CHECK-LABEL: define i1 @test_i1(
6; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    [[TMP0:%.*]] = load i1, ptr [[A]], align 1
9; CHECK-NEXT:    store i1 [[TMP0]], ptr [[B]], align 1
10; CHECK-NEXT:    ret i1 [[TMP0]]
11;
12entry:
13  %0 = load i1, ptr %a, align 1
14  store i1 %0, ptr %b, align 1
15  %1 = load i1, ptr %a, align 1
16  ret i1 %1
17}
18
19define i8 @test_i8(ptr %a, ptr %b, ptr %c) {
20; CHECK-LABEL: define i8 @test_i8(
21; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
22; CHECK-NEXT:  entry:
23; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
24; CHECK-NEXT:    store i8 [[TMP0]], ptr [[B]], align 1
25; CHECK-NEXT:    ret i8 [[TMP0]]
26;
27entry:
28  %0 = load i8, ptr %a, align 1
29  store i8 %0, ptr %b, align 1
30  %1 = load i8, ptr %a, align 1
31  ret i8 %1
32}
33
34define i32 @test_i32(ptr %a, ptr %b, ptr %c) {
35; CHECK-LABEL: define i32 @test_i32(
36; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
37; CHECK-NEXT:  entry:
38; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
39; CHECK-NEXT:    store i32 [[TMP0]], ptr [[B]], align 4
40; CHECK-NEXT:    ret i32 [[TMP0]]
41;
42entry:
43  %0 = load i32, ptr %a, align 4
44  store i32 %0, ptr %b, align 4
45  %1 = load i32, ptr %a, align 4
46  ret i32 %1
47}
48
49define float @test_float(ptr %a, ptr %b, ptr %c) {
50; CHECK-LABEL: define float @test_float(
51; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
52; CHECK-NEXT:  entry:
53; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[A]], align 4
54; CHECK-NEXT:    store float [[TMP0]], ptr [[B]], align 4
55; CHECK-NEXT:    ret float [[TMP0]]
56;
57entry:
58  %0 = load float, ptr %a, align 4
59  store float %0, ptr %b, align 4
60  %1 = load float, ptr %a, align 4
61  ret float %1
62}
63
64define i32 @test_unaligned_store(ptr %a, ptr %b, ptr %c) {
65; CHECK-LABEL: define i32 @test_unaligned_store(
66; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
67; CHECK-NEXT:  entry:
68; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
69; CHECK-NEXT:    store i32 [[TMP0]], ptr [[B]], align 2
70; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A]], align 4
71; CHECK-NEXT:    ret i32 [[TMP1]]
72;
73entry:
74  %0 = load i32, ptr %a, align 4
75  store i32 %0, ptr %b, align 2
76  %1 = load i32, ptr %a, align 4
77  ret i32 %1
78}
79
80define i32 @test_unaligned_loads(ptr %a, ptr %b, ptr %c) {
81; CHECK-LABEL: define i32 @test_unaligned_loads(
82; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
83; CHECK-NEXT:  entry:
84; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 2
85; CHECK-NEXT:    store i32 [[TMP0]], ptr [[B]], align 4
86; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A]], align 2
87; CHECK-NEXT:    ret i32 [[TMP1]]
88;
89entry:
90  %0 = load i32, ptr %a, align 2
91  store i32 %0, ptr %b, align 4
92  %1 = load i32, ptr %a, align 2
93  ret i32 %1
94}
95
96define i8 @test_modify_between(ptr %a, ptr %b, ptr %c) {
97; CHECK-LABEL: define i8 @test_modify_between(
98; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
99; CHECK-NEXT:  entry:
100; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[A]], align 1
101; CHECK-NEXT:    store i8 42, ptr [[C]], align 1
102; CHECK-NEXT:    store i8 [[TMP0]], ptr [[B]], align 1
103; CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr [[A]], align 1
104; CHECK-NEXT:    ret i8 [[TMP1]]
105;
106entry:
107  %0 = load i8, ptr %a, align 1
108  store i8 42, ptr %c, align 1
109  store i8 %0, ptr %b, align 1
110  %1 = load i8, ptr %a, align 1
111  ret i8 %1
112}
113
114define i32 @test_unordered(ptr %a, ptr %b, ptr %c) {
115; CHECK-LABEL: define i32 @test_unordered(
116; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
117; CHECK-NEXT:  entry:
118; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
119; CHECK-NEXT:    store i32 [[TMP0]], ptr [[B]], align 4
120; CHECK-NEXT:    [[TMP1:%.*]] = load atomic i32, ptr [[A]] unordered, align 4
121; CHECK-NEXT:    ret i32 [[TMP1]]
122;
123entry:
124  %0 = load i32, ptr %a, align 4
125  store i32 %0, ptr %b, align 4
126  %1 = load atomic i32, ptr %a unordered, align 4
127  ret i32 %1
128}
129