Skip to content

Commit f041c37

Browse files
chen.qiangerekon
authored andcommitted
[Test] add LoopUnrollAndRemainder test cases
1 parent 41b599e commit f041c37

File tree

15 files changed

+1906
-0
lines changed

15 files changed

+1906
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -mtriple=riscv32-esp-unknown-elf -passes=riscv-loop-unroll-and-remainder -riscv-loop-unroll-and-remainder=false < %s | FileCheck %s
3+
define dso_local noundef i32 @dsps_add_f32_ansi(ptr noundef readonly %input1, ptr noundef readonly %input2, ptr noundef writeonly %output, i32 noundef %len, i32 noundef %step1, i32 noundef %step2, i32 noundef %step_out) local_unnamed_addr {
4+
; CHECK-LABEL: define dso_local noundef i32 @dsps_add_f32_ansi(
5+
; CHECK-SAME: ptr noundef readonly [[INPUT1:%.*]], ptr noundef readonly [[INPUT2:%.*]], ptr noundef writeonly [[OUTPUT:%.*]], i32 noundef [[LEN:%.*]], i32 noundef [[STEP1:%.*]], i32 noundef [[STEP2:%.*]], i32 noundef [[STEP_OUT:%.*]]) local_unnamed_addr {
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[INPUT1]], null
8+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[INPUT2]], null
9+
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
10+
; CHECK-NEXT: [[CMP4:%.*]] = icmp eq ptr [[OUTPUT]], null
11+
; CHECK-NEXT: [[OR_COND19:%.*]] = or i1 [[OR_COND]], [[CMP4]]
12+
; CHECK-NEXT: br i1 [[OR_COND19]], label [[RETURN:%.*]], label [[IF_END:%.*]]
13+
; CHECK: if.end:
14+
; CHECK-NEXT: [[CMP41:%.*]] = icmp sgt i32 [[LEN]], 2
15+
; CHECK-NEXT: br i1 [[CMP41]], label [[FOR_BODY:%.*]], label [[FOR_COND_PREHEADER:%.*]]
16+
; CHECK: for.cond.preheader:
17+
; CHECK-NEXT: [[CMP720:%.*]] = icmp sgt i32 [[LEN]], 0
18+
; CHECK-NEXT: br i1 [[CMP720]], label [[FOR_BODY_CLONE:%.*]], label [[RETURN]]
19+
; CHECK: for.body:
20+
; CHECK-NEXT: [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_END]] ]
21+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[I_021]], [[STEP1]]
22+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[INPUT1]], i32 [[MUL]]
23+
; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 4
24+
; CHECK-NEXT: [[MUL8:%.*]] = mul nsw i32 [[I_021]], [[STEP2]]
25+
; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds float, ptr [[INPUT2]], i32 [[MUL8]]
26+
; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX9]], align 4
27+
; CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[TMP1]]
28+
; CHECK-NEXT: [[MUL10:%.*]] = mul nsw i32 [[I_021]], [[STEP_OUT]]
29+
; CHECK-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds float, ptr [[OUTPUT]], i32 [[MUL10]]
30+
; CHECK-NEXT: store float [[ADD]], ptr [[ARRAYIDX11]], align 4
31+
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_021]], 1
32+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[LEN]]
33+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[RETURN]], label [[FOR_BODY]]
34+
; CHECK: for.body.clone:
35+
; CHECK-NEXT: [[I_021_CLONE:%.*]] = phi i32 [ [[INC_CLONE:%.*]], [[FOR_BODY_CLONE]] ], [ 0, [[FOR_COND_PREHEADER]] ]
36+
; CHECK-NEXT: [[MUL_CLONE:%.*]] = mul nsw i32 [[I_021_CLONE]], [[STEP1]]
37+
; CHECK-NEXT: [[ARRAYIDX_CLONE:%.*]] = getelementptr inbounds float, ptr [[INPUT1]], i32 [[MUL_CLONE]]
38+
; CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[ARRAYIDX_CLONE]], align 4
39+
; CHECK-NEXT: [[MUL8_CLONE:%.*]] = mul nsw i32 [[I_021_CLONE]], [[STEP2]]
40+
; CHECK-NEXT: [[ARRAYIDX9_CLONE:%.*]] = getelementptr inbounds float, ptr [[INPUT2]], i32 [[MUL8_CLONE]]
41+
; CHECK-NEXT: [[TMP3:%.*]] = load float, ptr [[ARRAYIDX9_CLONE]], align 4
42+
; CHECK-NEXT: [[ADD_CLONE:%.*]] = fadd float [[TMP2]], [[TMP3]]
43+
; CHECK-NEXT: [[MUL10_CLONE:%.*]] = mul nsw i32 [[I_021_CLONE]], [[STEP_OUT]]
44+
; CHECK-NEXT: [[ARRAYIDX11_CLONE:%.*]] = getelementptr inbounds float, ptr [[OUTPUT]], i32 [[MUL10_CLONE]]
45+
; CHECK-NEXT: store float [[ADD_CLONE]], ptr [[ARRAYIDX11_CLONE]], align 4
46+
; CHECK-NEXT: [[INC_CLONE]] = add nuw nsw i32 [[I_021_CLONE]], 1
47+
; CHECK-NEXT: [[EXITCOND_NOT_CLONE:%.*]] = icmp eq i32 [[INC_CLONE]], [[LEN]]
48+
; CHECK-NEXT: br i1 [[EXITCOND_NOT_CLONE]], label [[RETURN]], label [[FOR_BODY_CLONE]]
49+
; CHECK: return:
50+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 458755, [[ENTRY:%.*]] ], [ 0, [[FOR_COND_PREHEADER]] ], [ 0, [[FOR_BODY]] ], [ 0, [[FOR_BODY_CLONE]] ]
51+
; CHECK-NEXT: ret i32 [[RETVAL_0]]
52+
;
53+
entry:
54+
%cmp = icmp eq ptr %input1, null
55+
%cmp1 = icmp eq ptr %input2, null
56+
%or.cond = or i1 %cmp, %cmp1
57+
%cmp4 = icmp eq ptr %output, null
58+
%or.cond19 = or i1 %or.cond, %cmp4
59+
br i1 %or.cond19, label %return, label %if.end
60+
61+
if.end: ; preds = %entry
62+
%cmp41 = icmp sgt i32 %len, 2
63+
br i1 %cmp41, label %for.body, label %for.cond.preheader
64+
65+
for.cond.preheader: ; preds = %if.end
66+
%cmp720 = icmp sgt i32 %len, 0
67+
br i1 %cmp720, label %for.body.clone, label %return
68+
69+
for.body: ; preds = %for.body, %if.end
70+
%i.021 = phi i32 [ %inc, %for.body ], [ 0, %if.end ]
71+
%mul = mul nsw i32 %i.021, %step1
72+
%arrayidx = getelementptr inbounds float, ptr %input1, i32 %mul
73+
%0 = load float, ptr %arrayidx, align 4
74+
%mul8 = mul nsw i32 %i.021, %step2
75+
%arrayidx9 = getelementptr inbounds float, ptr %input2, i32 %mul8
76+
%1 = load float, ptr %arrayidx9, align 4
77+
%add = fadd float %0, %1
78+
%mul10 = mul nsw i32 %i.021, %step_out
79+
%arrayidx11 = getelementptr inbounds float, ptr %output, i32 %mul10
80+
store float %add, ptr %arrayidx11, align 4
81+
%inc = add nuw nsw i32 %i.021, 1
82+
%exitcond.not = icmp eq i32 %inc, %len
83+
br i1 %exitcond.not, label %return, label %for.body
84+
85+
for.body.clone: ; preds = %for.body.clone, %for.cond.preheader
86+
%i.021.clone = phi i32 [ %inc.clone, %for.body.clone ], [ 0, %for.cond.preheader ]
87+
%mul.clone = mul nsw i32 %i.021.clone, %step1
88+
%arrayidx.clone = getelementptr inbounds float, ptr %input1, i32 %mul.clone
89+
%2 = load float, ptr %arrayidx.clone, align 4
90+
%mul8.clone = mul nsw i32 %i.021.clone, %step2
91+
%arrayidx9.clone = getelementptr inbounds float, ptr %input2, i32 %mul8.clone
92+
%3 = load float, ptr %arrayidx9.clone, align 4
93+
%add.clone = fadd float %2, %3
94+
%mul10.clone = mul nsw i32 %i.021.clone, %step_out
95+
%arrayidx11.clone = getelementptr inbounds float, ptr %output, i32 %mul10.clone
96+
store float %add.clone, ptr %arrayidx11.clone, align 4
97+
%inc.clone = add nuw nsw i32 %i.021.clone, 1
98+
%exitcond.not.clone = icmp eq i32 %inc.clone, %len
99+
br i1 %exitcond.not.clone, label %return, label %for.body.clone
100+
101+
return: ; preds = %for.body.clone, %for.body, %for.cond.preheader, %entry
102+
%retval.0 = phi i32 [ 458755, %entry ], [ 0, %for.cond.preheader ], [ 0, %for.body ], [ 0, %for.body.clone ]
103+
ret i32 %retval.0
104+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -mtriple=riscv32-esp-unknown-elf -passes=riscv-loop-unroll-and-remainder -riscv-loop-unroll-and-remainder=false < %s | FileCheck %s
3+
define dso_local noundef i32 @dsps_addc_f32_ansi(ptr noundef readonly %input, ptr noundef writeonly %output, i32 noundef %len, float noundef %C, i32 noundef %step_in, i32 noundef %step_out) local_unnamed_addr {
4+
; CHECK-LABEL: define dso_local noundef i32 @dsps_addc_f32_ansi(
5+
; CHECK-SAME: ptr noundef readonly [[INPUT:%.*]], ptr noundef writeonly [[OUTPUT:%.*]], i32 noundef [[LEN:%.*]], float noundef [[C:%.*]], i32 noundef [[STEP_IN:%.*]], i32 noundef [[STEP_OUT:%.*]]) local_unnamed_addr {
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[INPUT]], null
8+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[OUTPUT]], null
9+
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
10+
; CHECK-NEXT: br i1 [[OR_COND]], label [[RETURN:%.*]], label [[IF_END:%.*]]
11+
; CHECK: if.end:
12+
; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[LEN]], 2
13+
; CHECK-NEXT: br i1 [[CMP4]], label [[FOR_BODY:%.*]], label [[FOR_COND_PREHEADER:%.*]]
14+
; CHECK: for.cond.preheader:
15+
; CHECK-NEXT: [[CMP412:%.*]] = icmp sgt i32 [[LEN]], 0
16+
; CHECK-NEXT: br i1 [[CMP412]], label [[FOR_BODY_CLONE:%.*]], label [[RETURN]]
17+
; CHECK: for.body:
18+
; CHECK-NEXT: [[I_013:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_END]] ]
19+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[I_013]], [[STEP_IN]]
20+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[INPUT]], i32 [[MUL]]
21+
; CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[ARRAYIDX]], align 4
22+
; CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP0]], [[C]]
23+
; CHECK-NEXT: [[MUL5:%.*]] = mul nsw i32 [[I_013]], [[STEP_OUT]]
24+
; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds float, ptr [[OUTPUT]], i32 [[MUL5]]
25+
; CHECK-NEXT: store float [[ADD]], ptr [[ARRAYIDX6]], align 4
26+
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_013]], 1
27+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[LEN]]
28+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[RETURN]], label [[FOR_BODY]]
29+
; CHECK: for.body.clone:
30+
; CHECK-NEXT: [[I_013_CLONE:%.*]] = phi i32 [ [[INC_CLONE:%.*]], [[FOR_BODY_CLONE]] ], [ 0, [[FOR_COND_PREHEADER]] ]
31+
; CHECK-NEXT: [[MUL_CLONE:%.*]] = mul nsw i32 [[I_013_CLONE]], [[STEP_IN]]
32+
; CHECK-NEXT: [[ARRAYIDX_CLONE:%.*]] = getelementptr inbounds float, ptr [[INPUT]], i32 [[MUL_CLONE]]
33+
; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[ARRAYIDX_CLONE]], align 4
34+
; CHECK-NEXT: [[ADD_CLONE:%.*]] = fadd float [[TMP1]], [[C]]
35+
; CHECK-NEXT: [[MUL5_CLONE:%.*]] = mul nsw i32 [[I_013_CLONE]], [[STEP_OUT]]
36+
; CHECK-NEXT: [[ARRAYIDX6_CLONE:%.*]] = getelementptr inbounds float, ptr [[OUTPUT]], i32 [[MUL5_CLONE]]
37+
; CHECK-NEXT: store float [[ADD_CLONE]], ptr [[ARRAYIDX6_CLONE]], align 4
38+
; CHECK-NEXT: [[INC_CLONE]] = add nuw nsw i32 [[I_013_CLONE]], 1
39+
; CHECK-NEXT: [[EXITCOND_NOT_CLONE:%.*]] = icmp eq i32 [[INC_CLONE]], [[LEN]]
40+
; CHECK-NEXT: br i1 [[EXITCOND_NOT_CLONE]], label [[RETURN]], label [[FOR_BODY_CLONE]]
41+
; CHECK: return:
42+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 458755, [[ENTRY:%.*]] ], [ 0, [[FOR_COND_PREHEADER]] ], [ 0, [[FOR_BODY]] ], [ 0, [[FOR_BODY_CLONE]] ]
43+
; CHECK-NEXT: ret i32 [[RETVAL_0]]
44+
;
45+
entry:
46+
%cmp = icmp eq ptr %input, null
47+
%cmp1 = icmp eq ptr %output, null
48+
%or.cond = or i1 %cmp, %cmp1
49+
br i1 %or.cond, label %return, label %if.end
50+
51+
if.end: ; preds = %entry
52+
%cmp4 = icmp sgt i32 %len, 2
53+
br i1 %cmp4, label %for.body, label %for.cond.preheader
54+
55+
for.cond.preheader: ; preds = %if.end
56+
%cmp412 = icmp sgt i32 %len, 0
57+
br i1 %cmp412, label %for.body.clone, label %return
58+
59+
for.body: ; preds = %for.body, %if.end
60+
%i.013 = phi i32 [ %inc, %for.body ], [ 0, %if.end ]
61+
%mul = mul nsw i32 %i.013, %step_in
62+
%arrayidx = getelementptr inbounds float, ptr %input, i32 %mul
63+
%0 = load float, ptr %arrayidx, align 4
64+
%add = fadd float %0, %C
65+
%mul5 = mul nsw i32 %i.013, %step_out
66+
%arrayidx6 = getelementptr inbounds float, ptr %output, i32 %mul5
67+
store float %add, ptr %arrayidx6, align 4
68+
%inc = add nuw nsw i32 %i.013, 1
69+
%exitcond.not = icmp eq i32 %inc, %len
70+
br i1 %exitcond.not, label %return, label %for.body
71+
72+
for.body.clone: ; preds = %for.body.clone, %for.cond.preheader
73+
%i.013.clone = phi i32 [ %inc.clone, %for.body.clone ], [ 0, %for.cond.preheader ]
74+
%mul.clone = mul nsw i32 %i.013.clone, %step_in
75+
%arrayidx.clone = getelementptr inbounds float, ptr %input, i32 %mul.clone
76+
%1 = load float, ptr %arrayidx.clone, align 4
77+
%add.clone = fadd float %1, %C
78+
%mul5.clone = mul nsw i32 %i.013.clone, %step_out
79+
%arrayidx6.clone = getelementptr inbounds float, ptr %output, i32 %mul5.clone
80+
store float %add.clone, ptr %arrayidx6.clone, align 4
81+
%inc.clone = add nuw nsw i32 %i.013.clone, 1
82+
%exitcond.not.clone = icmp eq i32 %inc.clone, %len
83+
br i1 %exitcond.not.clone, label %return, label %for.body.clone
84+
85+
return: ; preds = %for.body.clone, %for.body, %for.cond.preheader, %entry
86+
%retval.0 = phi i32 [ 458755, %entry ], [ 0, %for.cond.preheader ], [ 0, %for.body ], [ 0, %for.body.clone ]
87+
ret i32 %retval.0
88+
}

0 commit comments

Comments
 (0)