1
1
; RUN: opt < %s --O3 -S | FileCheck %s
2
+ ; See issue #55013 and PR #70845 for more details.
3
+ ; This test comes from the following C program, compiled with :
4
+ ; > clang -O0 -S -emit-llvm -fno-discard-value-names
5
+ ;
6
+ ;; short vecreduce_smin_v2i16(int n, short* v)
7
+ ;; {
8
+ ;; short p = 0;
9
+ ;; for (int i = 0; i < n; ++i)
10
+ ;; p = p > v[i] ? v[i] : p;
11
+ ;; return p;
12
+ ;; }
13
+ ;
14
+ ;; short vecreduce_smax_v2i16(int n, short* v)
15
+ ;; {
16
+ ;; short p = 0;
17
+ ;; for (int i = 0; i < n; ++i)
18
+ ;; p = p < v[i] ? v[i] : p;
19
+ ;; return p;
20
+ ;; }
2
21
3
- define signext i16 @vecreduce_smax_v2i16 (i32 noundef %0 , ptr noundef %1 ) #0 {
4
- ;; CHECK: @llvm.smax
5
- %3 = alloca i32 , align 4
6
- %4 = alloca ptr , align 8
7
- %5 = alloca i16 , align 2
8
- %6 = alloca i32 , align 4
9
- store i32 %0 , ptr %3 , align 4
10
- store ptr %1 , ptr %4 , align 8
11
- store i16 0 , ptr %5 , align 2
12
- store i32 0 , ptr %6 , align 4
13
- br label %7
14
-
15
- 7 : ; preds = %34, %2
16
- %8 = load i32 , ptr %6 , align 4
17
- %9 = load i32 , ptr %3 , align 4
18
- %10 = icmp slt i32 %8 , %9
19
- br i1 %10 , label %11 , label %37
20
-
21
- 11 : ; preds = %7
22
- %12 = load i16 , ptr %5 , align 2
23
- %13 = sext i16 %12 to i32
24
- %14 = load ptr , ptr %4 , align 8
25
- %15 = load i32 , ptr %6 , align 4
26
- %16 = sext i32 %15 to i64
27
- %17 = getelementptr inbounds i16 , ptr %14 , i64 %16
28
- %18 = load i16 , ptr %17 , align 2
29
- %19 = sext i16 %18 to i32
30
- %20 = icmp slt i32 %13 , %19
31
- br i1 %20 , label %21 , label %28
32
-
33
- 21 : ; preds = %11
34
- %22 = load ptr , ptr %4 , align 8
35
- %23 = load i32 , ptr %6 , align 4
36
- %24 = sext i32 %23 to i64
37
- %25 = getelementptr inbounds i16 , ptr %22 , i64 %24
38
- %26 = load i16 , ptr %25 , align 2
39
- %27 = sext i16 %26 to i32
40
- br label %31
41
-
42
- 28 : ; preds = %11
43
- %29 = load i16 , ptr %5 , align 2
44
- %30 = sext i16 %29 to i32
45
- br label %31
46
-
47
- 31 : ; preds = %28, %21
48
- %32 = phi i32 [ %27 , %21 ], [ %30 , %28 ]
49
- %33 = trunc i32 %32 to i16
50
- store i16 %33 , ptr %5 , align 2
51
- br label %34
52
-
53
- 34 : ; preds = %31
54
- %35 = load i32 , ptr %6 , align 4
55
- %36 = add nsw i32 %35 , 1
56
- store i32 %36 , ptr %6 , align 4
57
- br label %7
58
-
59
- 37 : ; preds = %7
60
- %38 = load i16 , ptr %5 , align 2
61
- ret i16 %38
62
- }
63
-
64
- define signext i16 @vecreduce_smin_v2i16 (i32 noundef %0 , ptr noundef %1 ) #0 {
65
- ; CHECK: @llvm.smin
66
- %3 = alloca i32 , align 4
67
- %4 = alloca ptr , align 8
68
- %5 = alloca i16 , align 2
69
- %6 = alloca i32 , align 4
70
- store i32 %0 , ptr %3 , align 4
71
- store ptr %1 , ptr %4 , align 8
72
- store i16 0 , ptr %5 , align 2
73
- store i32 0 , ptr %6 , align 4
74
- br label %7
75
-
76
- 7 : ; preds = %34, %2
77
- %8 = load i32 , ptr %6 , align 4
78
- %9 = load i32 , ptr %3 , align 4
79
- %10 = icmp slt i32 %8 , %9
80
- br i1 %10 , label %11 , label %37
81
-
82
- 11 : ; preds = %7
83
- %12 = load i16 , ptr %5 , align 2
84
- %13 = sext i16 %12 to i32
85
- %14 = load ptr , ptr %4 , align 8
86
- %15 = load i32 , ptr %6 , align 4
87
- %16 = sext i32 %15 to i64
88
- %17 = getelementptr inbounds i16 , ptr %14 , i64 %16
89
- %18 = load i16 , ptr %17 , align 2
90
- %19 = sext i16 %18 to i32
91
- %20 = icmp sgt i32 %13 , %19
92
- br i1 %20 , label %21 , label %28
93
-
94
- 21 : ; preds = %11
95
- %22 = load ptr , ptr %4 , align 8
96
- %23 = load i32 , ptr %6 , align 4
97
- %24 = sext i32 %23 to i64
98
- %25 = getelementptr inbounds i16 , ptr %22 , i64 %24
99
- %26 = load i16 , ptr %25 , align 2
100
- %27 = sext i16 %26 to i32
101
- br label %31
102
-
103
- 28 : ; preds = %11
104
- %29 = load i16 , ptr %5 , align 2
105
- %30 = sext i16 %29 to i32
106
- br label %31
107
-
108
- 31 : ; preds = %28, %21
109
- %32 = phi i32 [ %27 , %21 ], [ %30 , %28 ]
110
- %33 = trunc i32 %32 to i16
111
- store i16 %33 , ptr %5 , align 2
112
- br label %34
113
-
114
- 34 : ; preds = %31
115
- %35 = load i32 , ptr %6 , align 4
116
- %36 = add nsw i32 %35 , 1
117
- store i32 %36 , ptr %6 , align 4
118
- br label %7
119
-
120
- 37 : ; preds = %7
121
- %38 = load i16 , ptr %5 , align 2
122
- ret i16 %38
22
+ define signext i16 @vecreduce_smin_v2i16 (i32 noundef %n , ptr noundef %v ) {
23
+ ;; CHECK: @llvm.smin
24
+ entry:
25
+ %n.addr = alloca i32 , align 4
26
+ %v.addr = alloca ptr , align 8
27
+ %p = alloca i16 , align 2
28
+ %i = alloca i32 , align 4
29
+ store i32 %n , ptr %n.addr , align 4
30
+ store ptr %v , ptr %v.addr , align 8
31
+ store i16 0 , ptr %p , align 2
32
+ store i32 0 , ptr %i , align 4
33
+ br label %for.cond
34
+
35
+ for.cond: ; preds = %for.inc, %entry
36
+ %0 = load i32 , ptr %i , align 4
37
+ %1 = load i32 , ptr %n.addr , align 4
38
+ %cmp = icmp slt i32 %0 , %1
39
+ br i1 %cmp , label %for.body , label %for.end
40
+
41
+ for.body: ; preds = %for.cond
42
+ %2 = load i16 , ptr %p , align 2
43
+ %conv = sext i16 %2 to i32
44
+ %3 = load ptr , ptr %v.addr , align 8
45
+ %4 = load i32 , ptr %i , align 4
46
+ %idxprom = sext i32 %4 to i64
47
+ %arrayidx = getelementptr inbounds i16 , ptr %3 , i64 %idxprom
48
+ %5 = load i16 , ptr %arrayidx , align 2
49
+ %conv1 = sext i16 %5 to i32
50
+ %cmp2 = icmp sgt i32 %conv , %conv1
51
+ br i1 %cmp2 , label %cond.true , label %cond.false
52
+
53
+ cond.true: ; preds = %for.body
54
+ %6 = load ptr , ptr %v.addr , align 8
55
+ %7 = load i32 , ptr %i , align 4
56
+ %idxprom4 = sext i32 %7 to i64
57
+ %arrayidx5 = getelementptr inbounds i16 , ptr %6 , i64 %idxprom4
58
+ %8 = load i16 , ptr %arrayidx5 , align 2
59
+ %conv6 = sext i16 %8 to i32
60
+ br label %cond.end
61
+
62
+ cond.false: ; preds = %for.body
63
+ %9 = load i16 , ptr %p , align 2
64
+ %conv7 = sext i16 %9 to i32
65
+ br label %cond.end
66
+
67
+ cond.end: ; preds = %cond.false, %cond.true
68
+ %cond = phi i32 [ %conv6 , %cond.true ], [ %conv7 , %cond.false ]
69
+ %conv8 = trunc i32 %cond to i16
70
+ store i16 %conv8 , ptr %p , align 2
71
+ br label %for.inc
72
+
73
+ for.inc: ; preds = %cond.end
74
+ %10 = load i32 , ptr %i , align 4
75
+ %inc = add nsw i32 %10 , 1
76
+ store i32 %inc , ptr %i , align 4
77
+ br label %for.cond
78
+
79
+ for.end: ; preds = %for.cond
80
+ %11 = load i16 , ptr %p , align 2
81
+ ret i16 %11
123
82
}
124
83
84
+ ; Function Attrs: noinline nounwind optnone ssp uwtable(sync)
85
+ define signext i16 @vecreduce_smax_v2i16 (i32 noundef %n , ptr noundef %v ) {
86
+ ;; CHECK: @llvm.smax
87
+ entry:
88
+ %n.addr = alloca i32 , align 4
89
+ %v.addr = alloca ptr , align 8
90
+ %p = alloca i16 , align 2
91
+ %i = alloca i32 , align 4
92
+ store i32 %n , ptr %n.addr , align 4
93
+ store ptr %v , ptr %v.addr , align 8
94
+ store i16 0 , ptr %p , align 2
95
+ store i32 0 , ptr %i , align 4
96
+ br label %for.cond
97
+
98
+ for.cond: ; preds = %for.inc, %entry
99
+ %0 = load i32 , ptr %i , align 4
100
+ %1 = load i32 , ptr %n.addr , align 4
101
+ %cmp = icmp slt i32 %0 , %1
102
+ br i1 %cmp , label %for.body , label %for.end
103
+
104
+ for.body: ; preds = %for.cond
105
+ %2 = load i16 , ptr %p , align 2
106
+ %conv = sext i16 %2 to i32
107
+ %3 = load ptr , ptr %v.addr , align 8
108
+ %4 = load i32 , ptr %i , align 4
109
+ %idxprom = sext i32 %4 to i64
110
+ %arrayidx = getelementptr inbounds i16 , ptr %3 , i64 %idxprom
111
+ %5 = load i16 , ptr %arrayidx , align 2
112
+ %conv1 = sext i16 %5 to i32
113
+ %cmp2 = icmp slt i32 %conv , %conv1
114
+ br i1 %cmp2 , label %cond.true , label %cond.false
115
+
116
+ cond.true: ; preds = %for.body
117
+ %6 = load ptr , ptr %v.addr , align 8
118
+ %7 = load i32 , ptr %i , align 4
119
+ %idxprom4 = sext i32 %7 to i64
120
+ %arrayidx5 = getelementptr inbounds i16 , ptr %6 , i64 %idxprom4
121
+ %8 = load i16 , ptr %arrayidx5 , align 2
122
+ %conv6 = sext i16 %8 to i32
123
+ br label %cond.end
124
+
125
+ cond.false: ; preds = %for.body
126
+ %9 = load i16 , ptr %p , align 2
127
+ %conv7 = sext i16 %9 to i32
128
+ br label %cond.end
129
+
130
+ cond.end: ; preds = %cond.false, %cond.true
131
+ %cond = phi i32 [ %conv6 , %cond.true ], [ %conv7 , %cond.false ]
132
+ %conv8 = trunc i32 %cond to i16
133
+ store i16 %conv8 , ptr %p , align 2
134
+ br label %for.inc
125
135
136
+ for.inc: ; preds = %cond.end
137
+ %10 = load i32 , ptr %i , align 4
138
+ %inc = add nsw i32 %10 , 1
139
+ store i32 %inc , ptr %i , align 4
140
+ br label %for.cond
126
141
142
+ for.end: ; preds = %for.cond
143
+ %11 = load i16 , ptr %p , align 2
144
+ ret i16 %11
145
+ }
0 commit comments