@@ -41,135 +41,11 @@ define void @test_abs(i64 %arg) {
4141 ret void
4242}
4343
44- ; CHECK-LABEL: @test_smax(
45- ; CHECK: %[[CAST_LHS:.+]] = bitcast i64 %argL to <2 x i32>
46- ; CHECK: %[[LHS_LO:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 0
47- ; CHECK: %[[LHS_HI:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 1
48- ; CHECK: %[[CAST_RHS:.+]] = bitcast i64 %argR to <2 x i32>
49- ; CHECK: %[[RHS_LO:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 0
50- ; CHECK: %[[RHS_HI:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 1
51-
52- ; COM: Comparing LSBs in case MSB halves are equal
53- ; CHECK: %[[CMP_LO:.+]] = icmp ugt i32 %[[LHS_LO]], %[[RHS_LO]]
54- ; CHECK: %[[CMP_EQ_HI:.+]] = icmp eq i32 %[[LHS_HI]], %[[RHS_HI]]
55- ; CHECK: %[[COND_LO:.+]] = and i1 %[[CMP_EQ_HI]], %[[CMP_LO]]
56- ; COM: Comparing signed MSBs - sgt
57- ; CHECK: %[[COND_HI:.+]] = icmp sgt i32 %[[LHS_HI]], %[[RHS_HI]]
58- ; CHECK: %[[RES_COND:.+]] = or i1 %[[COND_LO]], %[[COND_HI]]
59-
60- ; CHECK: %[[SEL_LO:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_LO]], i32 %[[RHS_LO]]
61- ; CHECK: %[[SEL_HI:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_HI]], i32 %[[RHS_HI]]
62- ; CHECK: %[[RES_LO:.+]] = insertelement <2 x i32> undef, i32 %[[SEL_LO]], i32 0
63- ; CHECK: %[[RES_VEC:.+]] = insertelement <2 x i32> %[[RES_LO]], i32 %[[SEL_HI]], i32 1
64- ; CHECK: %[[RES_CAST:.+]] = bitcast <2 x i32> %[[RES_VEC]] to i64
65- ; CHECK: call void @use.i64(i64 %[[RES_CAST]])
66- ; CHECK: ret void
67- define void @test_smax (i64 %argL , i64 %argR ) {
68- %1 = call i64 @llvm.smax.i64 (i64 %argL , i64 %argR )
69- call void @use.i64 (i64 %1 )
70- ret void
71- }
72-
73- ; CHECK-LABEL: @test_smin(
74- ; CHECK: %[[CAST_LHS:.+]] = bitcast i64 %argL to <2 x i32>
75- ; CHECK: %[[LHS_LO:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 0
76- ; CHECK: %[[LHS_HI:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 1
77- ; CHECK: %[[CAST_RHS:.+]] = bitcast i64 %argR to <2 x i32>
78- ; CHECK: %[[RHS_LO:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 0
79- ; CHECK: %[[RHS_HI:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 1
80-
81- ; COM: Comparing LSBs in case MSB halves are equal
82- ; CHECK: %[[CMP_LO:.+]] = icmp ult i32 %[[LHS_LO]], %[[RHS_LO]]
83- ; CHECK: %[[CMP_EQ_HI:.+]] = icmp eq i32 %[[LHS_HI]], %[[RHS_HI]]
84- ; CHECK: %[[COND_LO:.+]] = and i1 %[[CMP_EQ_HI]], %[[CMP_LO]]
85- ; COM: Comparing signed MSBs - slt
86- ; CHECK: %[[COND_HI:.+]] = icmp slt i32 %[[LHS_HI]], %[[RHS_HI]]
87- ; CHECK: %[[RES_COND:.+]] = or i1 %[[COND_LO]], %[[COND_HI]]
88-
89- ; CHECK: %[[SEL_LO:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_LO]], i32 %[[RHS_LO]]
90- ; CHECK: %[[SEL_HI:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_HI]], i32 %[[RHS_HI]]
91- ; CHECK: %[[RES_LO:.+]] = insertelement <2 x i32> undef, i32 %[[SEL_LO]], i32 0
92- ; CHECK: %[[RES_VEC:.+]] = insertelement <2 x i32> %[[RES_LO]], i32 %[[SEL_HI]], i32 1
93- ; CHECK: %[[RES_CAST:.+]] = bitcast <2 x i32> %[[RES_VEC]] to i64
94- ; CHECK: call void @use.i64(i64 %[[RES_CAST]])
95- ; CHECK: ret void
96- define void @test_smin (i64 %argL , i64 %argR ) {
97- %1 = call i64 @llvm.smin.i64 (i64 %argL , i64 %argR )
98- call void @use.i64 (i64 %1 )
99- ret void
100- }
101-
102- ; CHECK-LABEL: @test_umax(
103- ; CHECK: %[[CAST_LHS:.+]] = bitcast i64 %argL to <2 x i32>
104- ; CHECK: %[[LHS_LO:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 0
105- ; CHECK: %[[LHS_HI:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 1
106- ; CHECK: %[[CAST_RHS:.+]] = bitcast i64 %argR to <2 x i32>
107- ; CHECK: %[[RHS_LO:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 0
108- ; CHECK: %[[RHS_HI:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 1
109-
110- ; COM: Comparing LSBs in case MSB halves are equal
111- ; CHECK: %[[CMP_LO:.+]] = icmp ugt i32 %[[LHS_LO]], %[[RHS_LO]]
112- ; CHECK: %[[CMP_EQ_HI:.+]] = icmp eq i32 %[[LHS_HI]], %[[RHS_HI]]
113- ; CHECK: %[[COND_LO:.+]] = and i1 %[[CMP_EQ_HI]], %[[CMP_LO]]
114- ; COM: Comparing unsigned MSBs - ugt
115- ; CHECK: %[[COND_HI:.+]] = icmp ugt i32 %[[LHS_HI]], %[[RHS_HI]]
116- ; CHECK: %[[RES_COND:.+]] = or i1 %[[COND_LO]], %[[COND_HI]]
117-
118- ; CHECK: %[[SEL_LO:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_LO]], i32 %[[RHS_LO]]
119- ; CHECK: %[[SEL_HI:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_HI]], i32 %[[RHS_HI]]
120- ; CHECK: %[[RES_LO:.+]] = insertelement <2 x i32> undef, i32 %[[SEL_LO]], i32 0
121- ; CHECK: %[[RES_VEC:.+]] = insertelement <2 x i32> %[[RES_LO]], i32 %[[SEL_HI]], i32 1
122- ; CHECK: %[[RES_CAST:.+]] = bitcast <2 x i32> %[[RES_VEC]] to i64
123- ; CHECK: call void @use.i64(i64 %[[RES_CAST]])
124- ; CHECK: ret void
125- define void @test_umax (i64 %argL , i64 %argR ) {
126- %1 = call i64 @llvm.umax.i64 (i64 %argL , i64 %argR )
127- call void @use.i64 (i64 %1 )
128- ret void
129- }
130-
131- ; CHECK-LABEL: @test_umin(
132- ; CHECK: %[[CAST_LHS:.+]] = bitcast i64 %argL to <2 x i32>
133- ; CHECK: %[[LHS_LO:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 0
134- ; CHECK: %[[LHS_HI:.+]] = extractelement <2 x i32> %[[CAST_LHS]], i32 1
135- ; CHECK: %[[CAST_RHS:.+]] = bitcast i64 %argR to <2 x i32>
136- ; CHECK: %[[RHS_LO:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 0
137- ; CHECK: %[[RHS_HI:.+]] = extractelement <2 x i32> %[[CAST_RHS]], i32 1
138-
139- ; COM: Comparing LSBs in case MSB halves are equal
140- ; CHECK: %[[CMP_LO:.+]] = icmp ult i32 %[[LHS_LO]], %[[RHS_LO]]
141- ; CHECK: %[[CMP_EQ_HI:.+]] = icmp eq i32 %[[LHS_HI]], %[[RHS_HI]]
142- ; CHECK: %[[COND_LO:.+]] = and i1 %[[CMP_EQ_HI]], %[[CMP_LO]]
143- ; COM: Comparing unsigned MSBs - ult
144- ; CHECK: %[[COND_HI:.+]] = icmp ult i32 %[[LHS_HI]], %[[RHS_HI]]
145- ; CHECK: %[[RES_COND:.+]] = or i1 %[[COND_LO]], %[[COND_HI]]
146-
147- ; CHECK: %[[SEL_LO:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_LO]], i32 %[[RHS_LO]]
148- ; CHECK: %[[SEL_HI:.+]] = select i1 %[[RES_COND]], i32 %[[LHS_HI]], i32 %[[RHS_HI]]
149- ; CHECK: %[[RES_LO:.+]] = insertelement <2 x i32> undef, i32 %[[SEL_LO]], i32 0
150- ; CHECK: %[[RES_VEC:.+]] = insertelement <2 x i32> %[[RES_LO]], i32 %[[SEL_HI]], i32 1
151- ; CHECK: %[[RES_CAST:.+]] = bitcast <2 x i32> %[[RES_VEC]] to i64
152- ; CHECK: call void @use.i64(i64 %[[RES_CAST]])
153- ; CHECK: ret void
154- define void @test_umin (i64 %argL , i64 %argR ) {
155- %1 = call i64 @llvm.umin.i64 (i64 %argL , i64 %argR )
156- call void @use.i64 (i64 %1 )
157- ret void
158- }
159-
16044declare i64 @llvm.abs.i64 (i64 , i1 )
161- declare i64 @llvm.smax.i64 (i64 , i64 )
162- declare i64 @llvm.smin.i64 (i64 , i64 )
163- declare i64 @llvm.umax.i64 (i64 , i64 )
164- declare i64 @llvm.umin.i64 (i64 , i64 )
16545declare void @use.i64 (i64 )
16646
167- !igc.functions = !{!0 , !3 , !4 , !5 , !6 }
47+ !igc.functions = !{!0 }
16848
16949!0 = !{void (i64 )* @test_abs , !1 }
17050!1 = !{!2 }
17151!2 = !{!"function_type" , i32 0 }
172- !3 = !{void (i64 , i64 )* @test_smax , !1 }
173- !4 = !{void (i64 , i64 )* @test_smin , !1 }
174- !5 = !{void (i64 , i64 )* @test_umax , !1 }
175- !6 = !{void (i64 , i64 )* @test_umin , !1 }
0 commit comments