[debug] Use poison instead of undef to set a killed dbg.assign address [NFC] (#119760)
[llvm-project.git] / llvm / test / Transforms / GVN / rle-clobbering-store.ll
blobb60f6c323d42d56e6803b3ed5c7a48b05c3380d6
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
4 define 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]]
12 entry:
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
19 define 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]]
27 entry:
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
34 define 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]]
42 entry:
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
49 define 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]]
57 entry:
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
64 define 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]]
73 entry:
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
80 define 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]]
89 entry:
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
96 define 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]]
106 entry:
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
114 define 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]]
123 entry:
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