1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -run-pass=legalizer %s -o - | FileCheck %s
3
4---
5name: trunc_s16_merge_s64_s32
6
7body: |
8  bb.0:
9    ; Test that trunc(merge) with trunc-size < merge-source-size creates a trunc
10    ; of the merge source
11    ; CHECK-LABEL: name: trunc_s16_merge_s64_s32
12    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
13    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
14    ; CHECK: $vgpr0 = COPY [[C]](s32)
15    %0:_(s32) = G_CONSTANT i32 0
16    %1:_(s32) = G_CONSTANT i32 1
17    %2:_(s64) = G_MERGE_VALUES %0, %1
18    %3:_(s16) = G_TRUNC %2
19    %4:_(s32) = G_ANYEXT %3
20    $vgpr0 = COPY %4
21...
22
23---
24name: trunc_s32_merge_s64_s32
25
26body: |
27  bb.0:
28    ; Test that trunc(merge) with trunc-size == merge-source-size is eliminated
29    ; CHECK-LABEL: name: trunc_s32_merge_s64_s32
30    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
31    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
32    ; CHECK: $vgpr0 = COPY [[C]](s32)
33    %0:_(s32) = G_CONSTANT i32 0
34    %1:_(s32) = G_CONSTANT i32 1
35    %2:_(s64) = G_MERGE_VALUES %0, %1
36    %3:_(s32) = G_TRUNC %2
37    $vgpr0 = COPY %3
38...
39
40---
41name: trunc_s64_merge_s128_s32
42
43body: |
44  bb.0:
45    ; Test that trunc(merge) with trunc-size > merge-source-size combines to a
46    ; smaller merge
47    ; CHECK-LABEL: name: trunc_s64_merge_s128_s32
48    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
49    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
50    ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C]](s32), [[C1]](s32)
51    ; CHECK: $vgpr0_vgpr1 = COPY [[MV]](s64)
52    %0:_(s32) = G_CONSTANT i32 0
53    %1:_(s32) = G_CONSTANT i32 1
54    %2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1
55    %3:_(s64) = G_TRUNC %2
56    $vgpr0_vgpr1 = COPY %3
57...
58
59---
60name: trunc_s32_merge_s128_p0
61
62body: |
63  bb.0:
64    ; Test that trunc(merge) with a non-scalar merge source is not combined
65    ; CHECK-LABEL: name: trunc_s32_merge_s128_p0
66    ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
67    ; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1
68    ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0)
69    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[MV]](s128)
70    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
71    %0:_(p0) = G_CONSTANT i64 0
72    %1:_(p0) = G_CONSTANT i64 1
73    %2:_(s128) = G_MERGE_VALUES %0, %1
74    %3:_(s32) = G_TRUNC %2
75    $vgpr0 = COPY %3
76...
77
78---
79name: trunc_s64_merge_s128_p0
80
81body: |
82  bb.0:
83    ; Test that trunc(merge) with a non-scalar merge source is not combined
84    ; CHECK-LABEL: name: trunc_s64_merge_s128_p0
85    ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
86    ; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1
87    ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0)
88    ; CHECK: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[MV]](s128)
89    ; CHECK: $vgpr0_vgpr1 = COPY [[TRUNC]](s64)
90    %0:_(p0) = G_CONSTANT i64 0
91    %1:_(p0) = G_CONSTANT i64 1
92    %2:_(s128) = G_MERGE_VALUES %0, %1
93    %3:_(s64) = G_TRUNC %2
94    $vgpr0_vgpr1 = COPY %3
95...
96
97---
98name: trunc_s128_merge_s192_p0
99
100body: |
101  bb.0:
102    ; Test that trunc(merge) with a non-scalar merge source is not combined
103    ; CHECK-LABEL: name: trunc_s128_merge_s192_p0
104    ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
105    ; CHECK: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1
106    ; CHECK: [[MV:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[C]](p0), [[C1]](p0), [[C]](p0)
107    ; CHECK: [[TRUNC:%[0-9]+]]:_(s128) = G_TRUNC [[MV]](s192)
108    ; CHECK: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[TRUNC]](s128)
109    %0:_(p0) = G_CONSTANT i64 0
110    %1:_(p0) = G_CONSTANT i64 1
111    %2:_(s192) = G_MERGE_VALUES %0, %1, %0
112    %3:_(s128) = G_TRUNC %2
113    $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %3
114...
115
116---
117name: trunc_s68_merge_s128_s32
118
119body: |
120  bb.0:
121    ; Test that trunc(merge) with trunc-size > merge-source-size and
122    ; trunc-size % merge-source-size != 0 can be combined after the G_TRUNCs
123    ; have been combined.
124    ; CHECK-LABEL: name: trunc_s68_merge_s128_s32
125    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
126    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
127    ; CHECK: $vgpr0 = COPY [[C]](s32)
128    %0:_(s32) = G_CONSTANT i32 0
129    %1:_(s32) = G_CONSTANT i32 1
130    %2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1
131    %3:_(s68) = G_TRUNC %2
132    %4:_(s32) = G_TRUNC %3
133    $vgpr0 = COPY %4
134...
135
136---
137name: trunc_trunc
138
139body: |
140  bb.0:
141    ; Test that trunc(trunc) is combined to a single trunc
142    ; CHECK-LABEL: name: trunc_trunc
143    ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
144    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[DEF]](s64)
145    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
146    %0:_(s64) = G_IMPLICIT_DEF
147    %1:_(s48) = G_TRUNC %0
148    %2:_(s32) = G_TRUNC %1
149    $vgpr0 = COPY %2
150...
151