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