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-NEXT: $vgpr0 = COPY [[C]](s32) 14 %0:_(s32) = G_CONSTANT i32 0 15 %1:_(s32) = G_CONSTANT i32 1 16 %2:_(s64) = G_MERGE_VALUES %0, %1 17 %3:_(s16) = G_TRUNC %2 18 %4:_(s32) = G_ANYEXT %3 19 $vgpr0 = COPY %4 20... 21 22--- 23name: trunc_s32_merge_s64_s32 24 25body: | 26 bb.0: 27 ; Test that trunc(merge) with trunc-size == merge-source-size is eliminated 28 ; CHECK-LABEL: name: trunc_s32_merge_s64_s32 29 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 30 ; CHECK-NEXT: $vgpr0 = COPY [[C]](s32) 31 %0:_(s32) = G_CONSTANT i32 0 32 %1:_(s32) = G_CONSTANT i32 1 33 %2:_(s64) = G_MERGE_VALUES %0, %1 34 %3:_(s32) = G_TRUNC %2 35 $vgpr0 = COPY %3 36... 37 38--- 39name: trunc_s64_merge_s128_s32 40 41body: | 42 bb.0: 43 ; Test that trunc(merge) with trunc-size > merge-source-size combines to a 44 ; smaller merge 45 ; CHECK-LABEL: name: trunc_s64_merge_s128_s32 46 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 47 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 48 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C]](s32), [[C1]](s32) 49 ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 50 %0:_(s32) = G_CONSTANT i32 0 51 %1:_(s32) = G_CONSTANT i32 1 52 %2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1 53 %3:_(s64) = G_TRUNC %2 54 $vgpr0_vgpr1 = COPY %3 55... 56 57--- 58name: trunc_s32_merge_s128_p0 59 60body: | 61 bb.0: 62 ; Test that trunc(merge) with a non-scalar merge source is not combined 63 ; CHECK-LABEL: name: trunc_s32_merge_s128_p0 64 ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 65 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 66 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0) 67 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[MV]](s128) 68 ; CHECK-NEXT: $vgpr0 = COPY [[TRUNC]](s32) 69 %0:_(p0) = G_CONSTANT i64 0 70 %1:_(p0) = G_CONSTANT i64 1 71 %2:_(s128) = G_MERGE_VALUES %0, %1 72 %3:_(s32) = G_TRUNC %2 73 $vgpr0 = COPY %3 74... 75 76--- 77name: trunc_s64_merge_s128_p0 78 79body: | 80 bb.0: 81 ; Test that trunc(merge) with a non-scalar merge source is not combined 82 ; CHECK-LABEL: name: trunc_s64_merge_s128_p0 83 ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 84 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 85 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](p0), [[C1]](p0) 86 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s64) = G_TRUNC [[MV]](s128) 87 ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[TRUNC]](s64) 88 %0:_(p0) = G_CONSTANT i64 0 89 %1:_(p0) = G_CONSTANT i64 1 90 %2:_(s128) = G_MERGE_VALUES %0, %1 91 %3:_(s64) = G_TRUNC %2 92 $vgpr0_vgpr1 = COPY %3 93... 94 95--- 96name: trunc_s128_merge_s192_p0 97 98body: | 99 bb.0: 100 ; Test that trunc(merge) with a non-scalar merge source is not combined 101 ; CHECK-LABEL: name: trunc_s128_merge_s192_p0 102 ; CHECK: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0 103 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p0) = G_CONSTANT i64 1 104 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[C]](p0), [[C1]](p0), [[C]](p0) 105 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s128) = G_TRUNC [[MV]](s192) 106 ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[TRUNC]](s128) 107 %0:_(p0) = G_CONSTANT i64 0 108 %1:_(p0) = G_CONSTANT i64 1 109 %2:_(s192) = G_MERGE_VALUES %0, %1, %0 110 %3:_(s128) = G_TRUNC %2 111 $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %3 112... 113 114--- 115name: trunc_s68_merge_s128_s32 116 117body: | 118 bb.0: 119 ; Test that trunc(merge) with trunc-size > merge-source-size and 120 ; trunc-size % merge-source-size != 0 can be combined after the G_TRUNCs 121 ; have been combined. 122 ; CHECK-LABEL: name: trunc_s68_merge_s128_s32 123 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 124 ; CHECK-NEXT: $vgpr0 = COPY [[C]](s32) 125 %0:_(s32) = G_CONSTANT i32 0 126 %1:_(s32) = G_CONSTANT i32 1 127 %2:_(s128) = G_MERGE_VALUES %0, %1, %0, %1 128 %3:_(s68) = G_TRUNC %2 129 %4:_(s32) = G_TRUNC %3 130 $vgpr0 = COPY %4 131... 132 133--- 134name: trunc_trunc 135 136body: | 137 bb.0: 138 ; Test that trunc(trunc) is combined to a single trunc 139 ; CHECK-LABEL: name: trunc_trunc 140 ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF 141 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[DEF]](s64) 142 ; CHECK-NEXT: $vgpr0 = COPY [[TRUNC]](s32) 143 %0:_(s64) = G_IMPLICIT_DEF 144 %1:_(s48) = G_TRUNC %0 145 %2:_(s32) = G_TRUNC %1 146 $vgpr0 = COPY %2 147... 148 149--- 150name: trunc_sext 151 152body: | 153 bb.0: 154 ; Test that trunc(sext) is replaced with sext source. 155 ; CHECK-LABEL: name: trunc_sext 156 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF 157 ; CHECK-NEXT: $vgpr0 = COPY [[DEF]](s32) 158 %0:_(s32) = G_IMPLICIT_DEF 159 %1:_(s64) = G_SEXT %0 160 %2:_(s32) = G_TRUNC %1 161 $vgpr0 = COPY %2 162... 163 164--- 165name: trunc_zext 166 167body: | 168 bb.0: 169 ; Test that trunc(zext) is replaced with zext source. 170 ; CHECK-LABEL: name: trunc_zext 171 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF 172 ; CHECK-NEXT: $vgpr0 = COPY [[DEF]](s32) 173 %0:_(s32) = G_IMPLICIT_DEF 174 %1:_(s64) = G_ZEXT %0 175 %2:_(s32) = G_TRUNC %1 176 $vgpr0 = COPY %2 177... 178 179--- 180name: trunc_anyext 181 182body: | 183 bb.0: 184 ; Test that trunc(anyext) is replaced with anyext source. 185 ; CHECK-LABEL: name: trunc_anyext 186 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF 187 ; CHECK-NEXT: $vgpr0 = COPY [[DEF]](s32) 188 %0:_(s32) = G_IMPLICIT_DEF 189 %1:_(s64) = G_ANYEXT %0 190 %2:_(s32) = G_TRUNC %1 191 $vgpr0 = COPY %2 192... 193 194--- 195name: trunc_ext 196 197body: | 198 bb.0: 199 ; Test that trunc(sext (trunc (...))) is replaced with source. 200 ; CHECK-LABEL: name: trunc_ext 201 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF 202 ; CHECK-NEXT: $vgpr0 = COPY [[DEF]](s32) 203 %0:_(s32) = G_IMPLICIT_DEF 204 %1:_(s64) = G_SEXT %0 205 %2:_(s32) = G_TRUNC %1 206 %3:_(s128) = G_ZEXT %2 207 %4:_(s64) = G_TRUNC %3 208 %5:_(s32) = G_TRUNC %4 209 $vgpr0 = COPY %5 210... 211