Skip to content

Commit 24562c6

Browse files
dsprenkelsrotateright
authored andcommitted
[InstCombine] Add tests for trunc (extelt x); (NFC)
Baseline tests for D76983 (PR45314) Differential Revision: https://reviews.llvm.org/D77024
1 parent 2451e4c commit 24562c6

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=ANY,LE
3+
; RUN: opt < %s -instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=ANY,BE
4+
5+
define i32 @shrinkExtractElt_i64_to_i32_0(<3 x i64> %x) {
6+
; ANY-LABEL: @shrinkExtractElt_i64_to_i32_0(
7+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i32 0
8+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i32
9+
; ANY-NEXT: ret i32 [[T]]
10+
;
11+
%e = extractelement <3 x i64> %x, i32 0
12+
%t = trunc i64 %e to i32
13+
ret i32 %t
14+
}
15+
16+
define i32 @shrinkExtractElt_i64_to_i32_1(<3 x i64> %x) {
17+
; ANY-LABEL: @shrinkExtractElt_i64_to_i32_1(
18+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i32 1
19+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i32
20+
; ANY-NEXT: ret i32 [[T]]
21+
;
22+
%e = extractelement <3 x i64> %x, i32 1
23+
%t = trunc i64 %e to i32
24+
ret i32 %t
25+
}
26+
27+
define i32 @shrinkExtractElt_i64_to_i32_2(<3 x i64> %x) {
28+
; ANY-LABEL: @shrinkExtractElt_i64_to_i32_2(
29+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i32 2
30+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i32
31+
; ANY-NEXT: ret i32 [[T]]
32+
;
33+
%e = extractelement <3 x i64> %x, i32 2
34+
%t = trunc i64 %e to i32
35+
ret i32 %t
36+
}
37+
38+
define i16 @shrinkExtractElt_i64_to_i16_0(<3 x i64> %x) {
39+
; ANY-LABEL: @shrinkExtractElt_i64_to_i16_0(
40+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i16 0
41+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i16
42+
; ANY-NEXT: ret i16 [[T]]
43+
;
44+
%e = extractelement <3 x i64> %x, i16 0
45+
%t = trunc i64 %e to i16
46+
ret i16 %t
47+
}
48+
49+
define i16 @shrinkExtractElt_i64_to_i16_1(<3 x i64> %x) {
50+
; ANY-LABEL: @shrinkExtractElt_i64_to_i16_1(
51+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i16 1
52+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i16
53+
; ANY-NEXT: ret i16 [[T]]
54+
;
55+
%e = extractelement <3 x i64> %x, i16 1
56+
%t = trunc i64 %e to i16
57+
ret i16 %t
58+
}
59+
60+
define i16 @shrinkExtractElt_i64_to_i16_2(<3 x i64> %x) {
61+
; ANY-LABEL: @shrinkExtractElt_i64_to_i16_2(
62+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i16 2
63+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i16
64+
; ANY-NEXT: ret i16 [[T]]
65+
;
66+
%e = extractelement <3 x i64> %x, i16 2
67+
%t = trunc i64 %e to i16
68+
ret i16 %t
69+
}
70+
71+
; Do not optimize if it would result in an invalid bitcast instruction.
72+
define i13 @shrinkExtractElt_i67_to_i13_2(<3 x i67> %x) {
73+
; ANY-LABEL: @shrinkExtractElt_i67_to_i13_2(
74+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i67> [[X:%.*]], i459 2
75+
; ANY-NEXT: [[T:%.*]] = trunc i67 [[E]] to i13
76+
; ANY-NEXT: ret i13 [[T]]
77+
;
78+
%e = extractelement <3 x i67> %x, i459 2
79+
%t = trunc i67 %e to i13
80+
ret i13 %t
81+
}
82+
83+
; Do not optimize if the bitcast instruction would be valid, but the
84+
; transform would be wrong.
85+
define i30 @shrinkExtractElt_i40_to_i30_1(<3 x i40> %x) {
86+
; ANY-LABEL: @shrinkExtractElt_i40_to_i30_1(
87+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i40> [[X:%.*]], i32 1
88+
; ANY-NEXT: [[T:%.*]] = trunc i40 [[E]] to i30
89+
; ANY-NEXT: ret i30 [[T]]
90+
;
91+
%e = extractelement <3 x i40> %x, i32 1
92+
%t = trunc i40 %e to i30
93+
ret i30 %t
94+
}
95+
96+
; Do not canonicalize if that would increase the instruction count.
97+
declare void @use(i64)
98+
define i16 @shrinkExtractElt_i64_to_i16_2_extra_use(<3 x i64> %x) {
99+
; ANY-LABEL: @shrinkExtractElt_i64_to_i16_2_extra_use(
100+
; ANY-NEXT: [[E:%.*]] = extractelement <3 x i64> [[X:%.*]], i64 2
101+
; ANY-NEXT: call void @use(i64 [[E]])
102+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i16
103+
; ANY-NEXT: ret i16 [[T]]
104+
;
105+
%e = extractelement <3 x i64> %x, i64 2
106+
call void @use(i64 %e)
107+
%t = trunc i64 %e to i16
108+
ret i16 %t
109+
}
110+
111+
; Check to ensure PR45314 remains fixed.
112+
define <4 x i64> @PR45314(<4 x i64> %x) {
113+
; ANY-LABEL: @PR45314(
114+
; ANY-NEXT: [[E:%.*]] = extractelement <4 x i64> [[X:%.*]], i32 0
115+
; ANY-NEXT: [[T:%.*]] = trunc i64 [[E]] to i32
116+
; ANY-NEXT: [[I:%.*]] = insertelement <8 x i32> undef, i32 [[T]], i32 0
117+
; ANY-NEXT: [[S:%.*]] = shufflevector <8 x i32> [[I]], <8 x i32> undef, <8 x i32> zeroinitializer
118+
; ANY-NEXT: [[B:%.*]] = bitcast <8 x i32> [[S]] to <4 x i64>
119+
; ANY-NEXT: ret <4 x i64> [[B]]
120+
;
121+
%e = extractelement <4 x i64> %x, i32 0
122+
%t = trunc i64 %e to i32
123+
%i = insertelement <8 x i32> undef, i32 %t, i32 0
124+
%s = shufflevector <8 x i32> %i, <8 x i32> undef, <8 x i32> zeroinitializer
125+
%b = bitcast <8 x i32> %s to <4 x i64>
126+
ret <4 x i64> %b
127+
}

0 commit comments

Comments
 (0)