1// RUN: mlir-opt -split-input-file -spirv-canonicalize-gl %s | FileCheck %s 2 3// CHECK-LABEL: func @clamp_fordlessthan 4// CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32) 5func.func @clamp_fordlessthan(%input: f32, %min: f32, %max: f32) -> f32 { 6 // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]] 7 %0 = spirv.FOrdLessThan %min, %input : f32 8 %mid = spirv.Select %0, %input, %min : i1, f32 9 %1 = spirv.FOrdLessThan %mid, %max : f32 10 %2 = spirv.Select %1, %mid, %max : i1, f32 11 12 // CHECK-NEXT: spirv.ReturnValue [[RES]] 13 spirv.ReturnValue %2 : f32 14} 15 16// ----- 17 18// CHECK-LABEL: func @clamp_fordlessthan 19// CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32) 20func.func @clamp_fordlessthan(%input: f32, %min: f32, %max: f32) -> f32 { 21 // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]] 22 %0 = spirv.FOrdLessThan %input, %min : f32 23 %mid = spirv.Select %0, %min, %input : i1, f32 24 %1 = spirv.FOrdLessThan %max, %input : f32 25 %2 = spirv.Select %1, %max, %mid : i1, f32 26 27 // CHECK-NEXT: spirv.ReturnValue [[RES]] 28 spirv.ReturnValue %2 : f32 29} 30 31// ----- 32 33// CHECK-LABEL: func @clamp_fordlessthanequal 34// CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32) 35func.func @clamp_fordlessthanequal(%input: f32, %min: f32, %max: f32) -> f32 { 36 // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]] 37 %0 = spirv.FOrdLessThanEqual %min, %input : f32 38 %mid = spirv.Select %0, %input, %min : i1, f32 39 %1 = spirv.FOrdLessThanEqual %mid, %max : f32 40 %2 = spirv.Select %1, %mid, %max : i1, f32 41 42 // CHECK-NEXT: spirv.ReturnValue [[RES]] 43 spirv.ReturnValue %2 : f32 44} 45 46// ----- 47 48// CHECK-LABEL: func @clamp_fordlessthanequal 49// CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32) 50func.func @clamp_fordlessthanequal(%input: f32, %min: f32, %max: f32) -> f32 { 51 // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]] 52 %0 = spirv.FOrdLessThanEqual %input, %min : f32 53 %mid = spirv.Select %0, %min, %input : i1, f32 54 %1 = spirv.FOrdLessThanEqual %max, %input : f32 55 %2 = spirv.Select %1, %max, %mid : i1, f32 56 57 // CHECK-NEXT: spirv.ReturnValue [[RES]] 58 spirv.ReturnValue %2 : f32 59} 60 61// ----- 62 63// CHECK-LABEL: func @clamp_slessthan 64// CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32) 65func.func @clamp_slessthan(%input: si32, %min: si32, %max: si32) -> si32 { 66 // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]] 67 %0 = spirv.SLessThan %min, %input : si32 68 %mid = spirv.Select %0, %input, %min : i1, si32 69 %1 = spirv.SLessThan %mid, %max : si32 70 %2 = spirv.Select %1, %mid, %max : i1, si32 71 72 // CHECK-NEXT: spirv.ReturnValue [[RES]] 73 spirv.ReturnValue %2 : si32 74} 75 76// ----- 77 78// CHECK-LABEL: func @clamp_slessthan 79// CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32) 80func.func @clamp_slessthan(%input: si32, %min: si32, %max: si32) -> si32 { 81 // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]] 82 %0 = spirv.SLessThan %input, %min : si32 83 %mid = spirv.Select %0, %min, %input : i1, si32 84 %1 = spirv.SLessThan %max, %input : si32 85 %2 = spirv.Select %1, %max, %mid : i1, si32 86 87 // CHECK-NEXT: spirv.ReturnValue [[RES]] 88 spirv.ReturnValue %2 : si32 89} 90 91// ----- 92 93// CHECK-LABEL: func @clamp_slessthanequal 94// CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32) 95func.func @clamp_slessthanequal(%input: si32, %min: si32, %max: si32) -> si32 { 96 // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]] 97 %0 = spirv.SLessThanEqual %min, %input : si32 98 %mid = spirv.Select %0, %input, %min : i1, si32 99 %1 = spirv.SLessThanEqual %mid, %max : si32 100 %2 = spirv.Select %1, %mid, %max : i1, si32 101 102 // CHECK-NEXT: spirv.ReturnValue [[RES]] 103 spirv.ReturnValue %2 : si32 104} 105 106// ----- 107 108// CHECK-LABEL: func @clamp_slessthanequal 109// CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32) 110func.func @clamp_slessthanequal(%input: si32, %min: si32, %max: si32) -> si32 { 111 // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]] 112 %0 = spirv.SLessThanEqual %input, %min : si32 113 %mid = spirv.Select %0, %min, %input : i1, si32 114 %1 = spirv.SLessThanEqual %max, %input : si32 115 %2 = spirv.Select %1, %max, %mid : i1, si32 116 117 // CHECK-NEXT: spirv.ReturnValue [[RES]] 118 spirv.ReturnValue %2 : si32 119} 120 121// ----- 122 123// CHECK-LABEL: func @clamp_ulessthan 124// CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32) 125func.func @clamp_ulessthan(%input: i32, %min: i32, %max: i32) -> i32 { 126 // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]] 127 %0 = spirv.ULessThan %min, %input : i32 128 %mid = spirv.Select %0, %input, %min : i1, i32 129 %1 = spirv.ULessThan %mid, %max : i32 130 %2 = spirv.Select %1, %mid, %max : i1, i32 131 132 // CHECK-NEXT: spirv.ReturnValue [[RES]] 133 spirv.ReturnValue %2 : i32 134} 135 136// ----- 137 138// CHECK-LABEL: func @clamp_ulessthan 139// CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32) 140func.func @clamp_ulessthan(%input: i32, %min: i32, %max: i32) -> i32 { 141 // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]] 142 %0 = spirv.ULessThan %input, %min : i32 143 %mid = spirv.Select %0, %min, %input : i1, i32 144 %1 = spirv.ULessThan %max, %input : i32 145 %2 = spirv.Select %1, %max, %mid : i1, i32 146 147 // CHECK-NEXT: spirv.ReturnValue [[RES]] 148 spirv.ReturnValue %2 : i32 149} 150 151// ----- 152 153// CHECK-LABEL: func @clamp_ulessthanequal 154// CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32) 155func.func @clamp_ulessthanequal(%input: i32, %min: i32, %max: i32) -> i32 { 156 // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]] 157 %0 = spirv.ULessThanEqual %min, %input : i32 158 %mid = spirv.Select %0, %input, %min : i1, i32 159 %1 = spirv.ULessThanEqual %mid, %max : i32 160 %2 = spirv.Select %1, %mid, %max : i1, i32 161 162 // CHECK-NEXT: spirv.ReturnValue [[RES]] 163 spirv.ReturnValue %2 : i32 164} 165 166// ----- 167 168// CHECK-LABEL: func @clamp_ulessthanequal 169// CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32) 170func.func @clamp_ulessthanequal(%input: i32, %min: i32, %max: i32) -> i32 { 171 // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]] 172 %0 = spirv.ULessThanEqual %input, %min : i32 173 %mid = spirv.Select %0, %min, %input : i1, i32 174 %1 = spirv.ULessThanEqual %max, %input : i32 175 %2 = spirv.Select %1, %max, %mid : i1, i32 176 177 // CHECK-NEXT: spirv.ReturnValue [[RES]] 178 spirv.ReturnValue %2 : i32 179} 180