Skip to content

Commit 4b9b203

Browse files
committed
address pr comments
1 parent f839af7 commit 4b9b203

File tree

3 files changed

+100
-69
lines changed

3 files changed

+100
-69
lines changed

llvm/lib/Transforms/Scalar/Scalarizer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1094,7 +1094,7 @@ bool ScalarizerVisitor::visitExtractValueInst(ExtractValueInst &EVI) {
10941094
unsigned Index = EVI.getIndices()[0];
10951095
for (unsigned OpIdx = 0; OpIdx < Op0.size(); ++OpIdx) {
10961096
Value *ResElem = Builder.CreateExtractValue(
1097-
Op0[OpIdx], Index, EVI.getName() + ".elem" + std::to_string(Index));
1097+
Op0[OpIdx], Index, EVI.getName() + ".elem" + Twine(Index));
10981098
Res.push_back(ResElem);
10991099
}
11001100

llvm/test/CodeGen/DirectX/split-double.ll

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,42 @@
1-
; RUN: opt -passes='function(scalarizer<load-store>)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes='function(scalarizer)' -S -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
23

3-
; CHECK-LABEL: @test_vector_double_split_void
44
define void @test_vector_double_split_void(<2 x double> noundef %d) {
5-
; CHECK: [[ee0:%.*]] = extractelement <2 x double> %d, i64 0
6-
; CHECK: [[ie0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[ee0]])
7-
; CHECK: [[ee1:%.*]] = extractelement <2 x double> %d, i64 1
8-
; CHECK: [[ie1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[ee1]])
9-
; CHECK-NOT: extractvalue { i32, i32 } {{.*}}, 0
10-
; CHECK-NOT: insertelement <2 x i32> {{.*}}, i32 {{.*}}, i64 0
5+
; CHECK-LABEL: define void @test_vector_double_split_void(
6+
; CHECK-SAME: <2 x double> noundef [[D:%.*]]) {
7+
; CHECK-NEXT: [[D_I0:%.*]] = extractelement <2 x double> [[D]], i64 0
8+
; CHECK-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
9+
; CHECK-NEXT: [[D_I1:%.*]] = extractelement <2 x double> [[D]], i64 1
10+
; CHECK-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
11+
; CHECK-NEXT: ret void
12+
;
1113
%hlsl.asuint = call { <2 x i32>, <2 x i32> } @llvm.dx.splitdouble.v2i32(<2 x double> %d)
1214
ret void
1315
}
1416

15-
; CHECK-LABEL: @test_vector_double_split
1617
define noundef <3 x i32> @test_vector_double_split(<3 x double> noundef %d) {
17-
; CHECK: [[ee0:%.*]] = extractelement <3 x double> %d, i64 0
18-
; CHECK: [[ie0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[ee0]])
19-
; CHECK: [[ee1:%.*]] = extractelement <3 x double> %d, i64 1
20-
; CHECK: [[ie1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[ee1]])
21-
; CHECK: [[ee2:%.*]] = extractelement <3 x double> %d, i64 2
22-
; CHECK: [[ie2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[ee2]])
23-
; CHECK: [[ev00:%.*]] = extractvalue { i32, i32 } [[ie0]], 0
24-
; CHECK: [[ev01:%.*]] = extractvalue { i32, i32 } [[ie1]], 0
25-
; CHECK: [[ev02:%.*]] = extractvalue { i32, i32 } [[ie2]], 0
26-
; CHECK: [[ev10:%.*]] = extractvalue { i32, i32 } [[ie0]], 1
27-
; CHECK: [[ev11:%.*]] = extractvalue { i32, i32 } [[ie1]], 1
28-
; CHECK: [[ev12:%.*]] = extractvalue { i32, i32 } [[ie2]], 1
29-
; CHECK: [[add1:%.*]] = add i32 [[ev00]], [[ev10]]
30-
; CHECK: [[add2:%.*]] = add i32 [[ev01]], [[ev11]]
31-
; CHECK: [[add3:%.*]] = add i32 [[ev02]], [[ev12]]
32-
; CHECK: insertelement <3 x i32> poison, i32 [[add1]], i64 0
33-
; CHECK: insertelement <3 x i32> %{{.*}}, i32 [[add2]], i64 1
34-
; CHECK: insertelement <3 x i32> %{{.*}}, i32 [[add3]], i64 2
18+
; CHECK-LABEL: define noundef <3 x i32> @test_vector_double_split(
19+
; CHECK-SAME: <3 x double> noundef [[D:%.*]]) {
20+
; CHECK-NEXT: [[D_I0:%.*]] = extractelement <3 x double> [[D]], i64 0
21+
; CHECK-NEXT: [[HLSL_ASUINT_I0:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I0]])
22+
; CHECK-NEXT: [[D_I1:%.*]] = extractelement <3 x double> [[D]], i64 1
23+
; CHECK-NEXT: [[HLSL_ASUINT_I1:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I1]])
24+
; CHECK-NEXT: [[D_I2:%.*]] = extractelement <3 x double> [[D]], i64 2
25+
; CHECK-NEXT: [[HLSL_ASUINT_I2:%.*]] = call { i32, i32 } @llvm.dx.splitdouble.i32(double [[D_I2]])
26+
; CHECK-NEXT: [[DOTELEM0:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 0
27+
; CHECK-NEXT: [[DOTELEM01:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 0
28+
; CHECK-NEXT: [[DOTELEM02:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 0
29+
; CHECK-NEXT: [[DOTELEM1:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I0]], 1
30+
; CHECK-NEXT: [[DOTELEM13:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I1]], 1
31+
; CHECK-NEXT: [[DOTELEM14:%.*]] = extractvalue { i32, i32 } [[HLSL_ASUINT_I2]], 1
32+
; CHECK-NEXT: [[DOTI0:%.*]] = add i32 [[DOTELEM0]], [[DOTELEM1]]
33+
; CHECK-NEXT: [[DOTI1:%.*]] = add i32 [[DOTELEM01]], [[DOTELEM13]]
34+
; CHECK-NEXT: [[DOTI2:%.*]] = add i32 [[DOTELEM02]], [[DOTELEM14]]
35+
; CHECK-NEXT: [[DOTUPTO015:%.*]] = insertelement <3 x i32> poison, i32 [[DOTI0]], i64 0
36+
; CHECK-NEXT: [[DOTUPTO116:%.*]] = insertelement <3 x i32> [[DOTUPTO015]], i32 [[DOTI1]], i64 1
37+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <3 x i32> [[DOTUPTO116]], i32 [[DOTI2]], i64 2
38+
; CHECK-NEXT: ret <3 x i32> [[TMP1]]
39+
;
3540
%hlsl.asuint = call { <3 x i32>, <3 x i32> } @llvm.dx.splitdouble.v3i32(<3 x double> %d)
3641
%1 = extractvalue { <3 x i32>, <3 x i32> } %hlsl.asuint, 0
3742
%2 = extractvalue { <3 x i32>, <3 x i32> } %hlsl.asuint, 1

llvm/test/Transforms/Scalarizer/frexp.ll

Lines changed: 67 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,91 @@
1-
; RUN: opt %s -passes='function(scalarizer<load-store>)' -S | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt %s -passes='function(scalarizer)' -S | FileCheck %s
3+
4+
define void @test_vector_frexp_void(<2 x double> noundef %d) {
5+
; CHECK-LABEL: define void @test_vector_frexp_void(
6+
; CHECK-SAME: <2 x double> noundef [[D:%.*]]) {
7+
; CHECK-NEXT: [[D_I0:%.*]] = extractelement <2 x double> [[D]], i64 0
8+
; CHECK-NEXT: [[DOTI0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I0]])
9+
; CHECK-NEXT: [[D_I1:%.*]] = extractelement <2 x double> [[D]], i64 1
10+
; CHECK-NEXT: [[DOTI1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I1]])
11+
; CHECK-NEXT: ret void
12+
;
13+
%1 = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %d)
14+
ret void
15+
}
216

3-
; CHECK-LABEL: @test_vector_half_frexp_half
417
define noundef <2 x half> @test_vector_half_frexp_half(<2 x half> noundef %h) {
5-
; CHECK: [[ee0:%.*]] = extractelement <2 x half> %h, i64 0
6-
; CHECK-NEXT: [[ie0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee0]])
7-
; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x half> %h, i64 1
8-
; CHECK-NEXT: [[ie1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee1]])
9-
; CHECK-NEXT: [[ev00:%.*]] = extractvalue { half, i32 } [[ie0]], 0
10-
; CHECK-NEXT: [[ev01:%.*]] = extractvalue { half, i32 } [[ie1]], 0
11-
; CHECK-NEXT: insertelement <2 x half> poison, half [[ev00]], i64 0
12-
; CHECK-NEXT: insertelement <2 x half> %{{.*}}, half [[ev01]], i64 1
18+
; CHECK-LABEL: define noundef <2 x half> @test_vector_half_frexp_half(
19+
; CHECK-SAME: <2 x half> noundef [[H:%.*]]) {
20+
; CHECK-NEXT: [[H_I0:%.*]] = extractelement <2 x half> [[H]], i64 0
21+
; CHECK-NEXT: [[R_I0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I0]])
22+
; CHECK-NEXT: [[H_I1:%.*]] = extractelement <2 x half> [[H]], i64 1
23+
; CHECK-NEXT: [[R_I1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I1]])
24+
; CHECK-NEXT: [[E0_ELEM0:%.*]] = extractvalue { half, i32 } [[R_I0]], 0
25+
; CHECK-NEXT: [[E0_ELEM01:%.*]] = extractvalue { half, i32 } [[R_I1]], 0
26+
; CHECK-NEXT: [[E0_UPTO0:%.*]] = insertelement <2 x half> poison, half [[E0_ELEM0]], i64 0
27+
; CHECK-NEXT: [[E0:%.*]] = insertelement <2 x half> [[E0_UPTO0]], half [[E0_ELEM01]], i64 1
28+
; CHECK-NEXT: ret <2 x half> [[E0]]
29+
;
1330
%r = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
1431
%e0 = extractvalue { <2 x half>, <2 x i32> } %r, 0
1532
ret <2 x half> %e0
1633
}
1734

18-
; CHECK-LABEL: @test_vector_half_frexp_int
1935
define noundef <2 x i32> @test_vector_half_frexp_int(<2 x half> noundef %h) {
20-
; CHECK: [[ee0:%.*]] = extractelement <2 x half> %h, i64 0
21-
; CHECK-NEXT: [[ie0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee0]])
22-
; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x half> %h, i64 1
23-
; CHECK-NEXT: [[ie1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[ee1]])
24-
; CHECK-NEXT: [[ev10:%.*]] = extractvalue { half, i32 } [[ie0]], 1
25-
; CHECK-NEXT: [[ev11:%.*]] = extractvalue { half, i32 } [[ie1]], 1
26-
; CHECK-NEXT: insertelement <2 x i32> poison, i32 [[ev10]], i64 0
27-
; CHECK-NEXT: insertelement <2 x i32> %{{.*}}, i32 [[ev11]], i64 1
36+
; CHECK-LABEL: define noundef <2 x i32> @test_vector_half_frexp_int(
37+
; CHECK-SAME: <2 x half> noundef [[H:%.*]]) {
38+
; CHECK-NEXT: [[H_I0:%.*]] = extractelement <2 x half> [[H]], i64 0
39+
; CHECK-NEXT: [[R_I0:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I0]])
40+
; CHECK-NEXT: [[H_I1:%.*]] = extractelement <2 x half> [[H]], i64 1
41+
; CHECK-NEXT: [[R_I1:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half [[H_I1]])
42+
; CHECK-NEXT: [[E1_ELEM1:%.*]] = extractvalue { half, i32 } [[R_I0]], 1
43+
; CHECK-NEXT: [[E1_ELEM11:%.*]] = extractvalue { half, i32 } [[R_I1]], 1
44+
; CHECK-NEXT: [[E1_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[E1_ELEM1]], i64 0
45+
; CHECK-NEXT: [[E1:%.*]] = insertelement <2 x i32> [[E1_UPTO0]], i32 [[E1_ELEM11]], i64 1
46+
; CHECK-NEXT: ret <2 x i32> [[E1]]
47+
;
2848
%r = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x half> %h)
2949
%e1 = extractvalue { <2 x half>, <2 x i32> } %r, 1
3050
ret <2 x i32> %e1
3151
}
3252

33-
; CHECK-LABEL: @test_vector_float_frexp_int
3453
define noundef <2 x float> @test_vector_float_frexp_int(<2 x float> noundef %f) {
35-
; CHECK: [[ee0:%.*]] = extractelement <2 x float> %f, i64 0
36-
; CHECK-NEXT: [[ie0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ee0]])
37-
; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x float> %f, i64 1
38-
; CHECK-NEXT: [[ie1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ee1]])
39-
; CHECK-NEXT: [[ev00:%.*]] = extractvalue { float, i32 } [[ie0]], 0
40-
; CHECK-NEXT: [[ev01:%.*]] = extractvalue { float, i32 } [[ie1]], 0
41-
; CHECK-NEXT: insertelement <2 x float> poison, float [[ev00]], i64 0
42-
; CHECK-NEXT: insertelement <2 x float> %{{.*}}, float [[ev01]], i64 1
43-
; CHECK-NEXT: extractvalue { float, i32 } [[ie0]], 1
44-
; CHECK-NEXT: extractvalue { float, i32 } [[ie1]], 1
54+
; CHECK-LABEL: define noundef <2 x float> @test_vector_float_frexp_int(
55+
; CHECK-SAME: <2 x float> noundef [[F:%.*]]) {
56+
; CHECK-NEXT: [[F_I0:%.*]] = extractelement <2 x float> [[F]], i64 0
57+
; CHECK-NEXT: [[DOTI0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[F_I0]])
58+
; CHECK-NEXT: [[F_I1:%.*]] = extractelement <2 x float> [[F]], i64 1
59+
; CHECK-NEXT: [[DOTI1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[F_I1]])
60+
; CHECK-NEXT: [[DOTELEM0:%.*]] = extractvalue { float, i32 } [[DOTI0]], 0
61+
; CHECK-NEXT: [[DOTELEM01:%.*]] = extractvalue { float, i32 } [[DOTI1]], 0
62+
; CHECK-NEXT: [[DOTUPTO010:%.*]] = insertelement <2 x float> poison, float [[DOTELEM0]], i64 0
63+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[DOTUPTO010]], float [[DOTELEM01]], i64 1
64+
; CHECK-NEXT: [[DOTELEM1:%.*]] = extractvalue { float, i32 } [[DOTI0]], 1
65+
; CHECK-NEXT: [[DOTELEM12:%.*]] = extractvalue { float, i32 } [[DOTI1]], 1
66+
; CHECK-NEXT: ret <2 x float> [[TMP1]]
67+
;
4568
%1 = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x float> %f)
4669
%2 = extractvalue { <2 x float>, <2 x i32> } %1, 0
4770
%3 = extractvalue { <2 x float>, <2 x i32> } %1, 1
4871
ret <2 x float> %2
4972
}
5073

51-
; CHECK-LABEL: @test_vector_double_frexp_int
5274
define noundef <2 x double> @test_vector_double_frexp_int(<2 x double> noundef %d) {
53-
; CHECK: [[ee0:%.*]] = extractelement <2 x double> %d, i64 0
54-
; CHECK-NEXT: [[ie0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[ee0]])
55-
; CHECK-NEXT: [[ee1:%.*]] = extractelement <2 x double> %d, i64 1
56-
; CHECK-NEXT: [[ie1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[ee1]])
57-
; CHECK-NEXT: [[ev00:%.*]] = extractvalue { double, i32 } [[ie0]], 0
58-
; CHECK-NEXT: [[ev01:%.*]] = extractvalue { double, i32 } [[ie1]], 0
59-
; CHECK-NEXT: insertelement <2 x double> poison, double [[ev00]], i64 0
60-
; CHECK-NEXT: insertelement <2 x double> %{{.*}}, double [[ev01]], i64 1
61-
; CHECK-NEXT: extractvalue { double, i32 } [[ie0]], 1
62-
; CHECK-NEXT: extractvalue { double, i32 } [[ie1]], 1
75+
; CHECK-LABEL: define noundef <2 x double> @test_vector_double_frexp_int(
76+
; CHECK-SAME: <2 x double> noundef [[D:%.*]]) {
77+
; CHECK-NEXT: [[D_I0:%.*]] = extractelement <2 x double> [[D]], i64 0
78+
; CHECK-NEXT: [[DOTI0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I0]])
79+
; CHECK-NEXT: [[D_I1:%.*]] = extractelement <2 x double> [[D]], i64 1
80+
; CHECK-NEXT: [[DOTI1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[D_I1]])
81+
; CHECK-NEXT: [[DOTELEM0:%.*]] = extractvalue { double, i32 } [[DOTI0]], 0
82+
; CHECK-NEXT: [[DOTELEM01:%.*]] = extractvalue { double, i32 } [[DOTI1]], 0
83+
; CHECK-NEXT: [[DOTUPTO010:%.*]] = insertelement <2 x double> poison, double [[DOTELEM0]], i64 0
84+
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> [[DOTUPTO010]], double [[DOTELEM01]], i64 1
85+
; CHECK-NEXT: [[DOTELEM1:%.*]] = extractvalue { double, i32 } [[DOTI0]], 1
86+
; CHECK-NEXT: [[DOTELEM12:%.*]] = extractvalue { double, i32 } [[DOTI1]], 1
87+
; CHECK-NEXT: ret <2 x double> [[TMP1]]
88+
;
6389
%1 = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %d)
6490
%2 = extractvalue { <2 x double>, <2 x i32> } %1, 0
6591
%3 = extractvalue { <2 x double>, <2 x i32> } %1, 1

0 commit comments

Comments
 (0)