Skip to content

Commit 0eb45cd

Browse files
committed
(NFC)[ConstantFold][InstSimplify] add tests for folding load for patterned arrays and structs
1 parent dc2d2ca commit 0eb45cd

File tree

2 files changed

+134
-48
lines changed

2 files changed

+134
-48
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3+
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
4+
@constzeroarray = internal constant [4 x i32] zeroinitializer
5+
6+
@constarray = internal constant [8 x i8] c"\01\00\01\00\01\00\01\00", align 4
7+
@conststruct = internal constant <{[8 x i8]}> <{[8 x i8] c"\01\00\01\00\01\00\01\00"}>, align 4
8+
9+
define i32 @load_gep_const_zero_array(i64 %idx) {
10+
; CHECK-LABEL: @load_gep_const_zero_array(
11+
; CHECK-NEXT: ret i32 0
12+
;
13+
%gep = getelementptr inbounds [4 x i32], ptr @constzeroarray, i64 0, i64 %idx
14+
%load = load i32, ptr %gep
15+
ret i32 %load
16+
}
17+
18+
define i8 @load_i8_multi_gep_const_zero_array(i64 %idx1, i64 %idx2) {
19+
; CHECK-LABEL: @load_i8_multi_gep_const_zero_array(
20+
; CHECK-NEXT: ret i8 0
21+
;
22+
%gep1 = getelementptr inbounds i8, ptr @constzeroarray, i64 %idx1
23+
%gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
24+
%load = load i8, ptr %gep
25+
ret i8 %load
26+
}
27+
28+
29+
define i32 @load_gep_const_patterned_array(i64 %idx) {
30+
; CHECK-LABEL: @load_gep_const_patterned_array(
31+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 [[IDX:%.*]]
32+
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4
33+
; CHECK-NEXT: ret i32 [[LOAD]]
34+
;
35+
%gep = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 %idx
36+
%load = load i32, ptr %gep
37+
ret i32 %load
38+
}
39+
40+
define i8 @load_i8_multi_gep_const_array(i64 %idx1, i64 %idx2) {
41+
; CHECK-LABEL: @load_i8_multi_gep_const_array(
42+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX1:%.*]]
43+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[GEP1]], i64 [[IDX2:%.*]]
44+
; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[GEP]], align 1
45+
; CHECK-NEXT: ret i8 [[LOAD]]
46+
;
47+
%gep1 = getelementptr inbounds i8, ptr @constarray, i64 %idx1
48+
%gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
49+
%load = load i8, ptr %gep
50+
ret i8 %load
51+
}
52+
53+
; TODO: this should be ret i8 1
54+
define i8 @gep_load_i8_align2(i64 %idx){
55+
; CHECK-LABEL: @gep_load_i8_align2(
56+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
57+
; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 2
58+
; CHECK-NEXT: ret i8 [[TMP2]]
59+
;
60+
%1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
61+
%2 = load i8, ptr %1, align 2
62+
ret i8 %2
63+
}
64+
65+
; can't be folded
66+
define i8 @gep_load_i8_align1(i64 %idx){
67+
; CHECK-LABEL: @gep_load_i8_align1(
68+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
69+
; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
70+
; CHECK-NEXT: ret i8 [[TMP2]]
71+
;
72+
%1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
73+
%2 = load i8, ptr %1, align 1
74+
ret i8 %2
75+
}
76+
77+
; TODO: this should be ret i8 65537 on the case for little endian
78+
define i32 @gep_i32_load_i32_align4(i64 %idx){
79+
; CHECK-LABEL: @gep_i32_load_i32_align4(
80+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr @constarray, i64 [[IDX:%.*]]
81+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
82+
; CHECK-NEXT: ret i32 [[TMP2]]
83+
;
84+
%1 = getelementptr inbounds i32, ptr @constarray, i64 %idx
85+
%2 = load i32, ptr %1, align 4
86+
ret i32 %2
87+
}
88+
89+
; TODO: this should be ret i8 65537 on the case for little endian
90+
define i32 @gep_i32_load_i32_align4_struct(i64 %idx){
91+
; CHECK-LABEL: @gep_i32_load_i32_align4_struct(
92+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr @conststruct, i64 [[IDX:%.*]]
93+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
94+
; CHECK-NEXT: ret i32 [[TMP2]]
95+
;
96+
%1 = getelementptr inbounds i32, ptr @conststruct, i64 %idx
97+
%2 = load i32, ptr %1, align 4
98+
ret i32 %2
99+
}
100+
101+
; can't be folded
102+
define i32 @gep_i8_load_i32_align1(i64 %idx){
103+
; CHECK-LABEL: @gep_i8_load_i32_align1(
104+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
105+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
106+
; CHECK-NEXT: ret i32 [[TMP2]]
107+
;
108+
%1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
109+
%2 = load i32, ptr %1, align 1
110+
ret i32 %2
111+
}
112+
113+
; can't be folded
114+
define i32 @gep_i8_load_i32_align1_struct(i64 %idx){
115+
; CHECK-LABEL: @gep_i8_load_i32_align1_struct(
116+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr @conststruct, i64 [[IDX:%.*]]
117+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
118+
; CHECK-NEXT: ret i32 [[TMP2]]
119+
;
120+
%1 = getelementptr inbounds i8, ptr @conststruct, i64 %idx
121+
%2 = load i32, ptr %1, align 1
122+
ret i32 %2
123+
}
124+
; TODO: This could be folded but need to see GEP source types
125+
define i32 @gep_i16_load_i32_align1(i64 %idx){
126+
; CHECK-LABEL: @gep_i16_load_i32_align1(
127+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr @constarray, i64 [[IDX:%.*]]
128+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
129+
; CHECK-NEXT: ret i32 [[TMP2]]
130+
;
131+
%1 = getelementptr inbounds i16, ptr @constarray, i64 %idx
132+
%2 = load i32, ptr %1, align 1
133+
ret i32 %2
134+
}

llvm/test/Transforms/InstSimplify/load.ll

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@
44
@zeroinit = constant {} zeroinitializer
55
@poison = constant {} poison
66

7-
@constzeroarray = internal constant [4 x i32] zeroinitializer
8-
9-
@constarray = internal constant [4 x i32] [i32 1, i32 1, i32 1, i32 1]
10-
@constarrayi8 = internal constant [2 x i8] [i8 1, i8 1]
11-
127
define i32 @crash_on_zeroinit() {
138
; CHECK-LABEL: @crash_on_zeroinit(
149
; CHECK-NEXT: ret i32 poison
@@ -45,46 +40,3 @@ define <3 x float> @load_vec3() {
4540
%1 = load <3 x float>, ptr getelementptr inbounds (<3 x float>, ptr @constvec, i64 1)
4641
ret <3 x float> %1
4742
}
48-
49-
define i32 @load_gep_const_zero_array(i64 %idx) {
50-
; CHECK-LABEL: @load_gep_const_zero_array(
51-
; CHECK-NEXT: ret i32 0
52-
;
53-
%gep = getelementptr inbounds [4 x i32], ptr @constzeroarray, i64 0, i64 %idx
54-
%load = load i32, ptr %gep
55-
ret i32 %load
56-
}
57-
58-
define i8 @load_i8_multi_gep_const_zero_array(i64 %idx1, i64 %idx2) {
59-
; CHECK-LABEL: @load_i8_multi_gep_const_zero_array(
60-
; CHECK-NEXT: ret i8 0
61-
;
62-
%gep1 = getelementptr inbounds i8, ptr @constzeroarray, i64 %idx1
63-
%gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
64-
%load = load i8, ptr %gep
65-
ret i8 %load
66-
}
67-
68-
define i32 @load_gep_const_array(i64 %idx) {
69-
; CHECK-LABEL: @load_gep_const_array(
70-
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 [[IDX:%.*]]
71-
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4
72-
; CHECK-NEXT: ret i32 [[LOAD]]
73-
;
74-
%gep = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 %idx
75-
%load = load i32, ptr %gep
76-
ret i32 %load
77-
}
78-
79-
define i8 @load_i8_multi_gep_const_array(i64 %idx1, i64 %idx2) {
80-
; CHECK-LABEL: @load_i8_multi_gep_const_array(
81-
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, ptr @constarrayi8, i64 [[IDX1:%.*]]
82-
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[GEP1]], i64 [[IDX2:%.*]]
83-
; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[GEP]], align 1
84-
; CHECK-NEXT: ret i8 [[LOAD]]
85-
;
86-
%gep1 = getelementptr inbounds i8, ptr @constarrayi8, i64 %idx1
87-
%gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
88-
%load = load i8, ptr %gep
89-
ret i8 %load
90-
}

0 commit comments

Comments
 (0)