180 lines · plain
1// RUN: mlir-opt -split-input-file -spirv-canonicalize-gl %s | FileCheck %s2 3// CHECK-LABEL: func @clamp_fordlessthan4// 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 : f328 %mid = spirv.Select %0, %input, %min : i1, f329 %1 = spirv.FOrdLessThan %mid, %max : f3210 %2 = spirv.Select %1, %mid, %max : i1, f3211 12 // CHECK-NEXT: spirv.ReturnValue [[RES]]13 spirv.ReturnValue %2 : f3214}15 16// -----17 18// CHECK-LABEL: func @clamp_fordlessthan19// 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 : f3223 %mid = spirv.Select %0, %min, %input : i1, f3224 %1 = spirv.FOrdLessThan %max, %input : f3225 %2 = spirv.Select %1, %max, %mid : i1, f3226 27 // CHECK-NEXT: spirv.ReturnValue [[RES]]28 spirv.ReturnValue %2 : f3229}30 31// -----32 33// CHECK-LABEL: func @clamp_fordlessthanequal34// 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 : f3238 %mid = spirv.Select %0, %input, %min : i1, f3239 %1 = spirv.FOrdLessThanEqual %mid, %max : f3240 %2 = spirv.Select %1, %mid, %max : i1, f3241 42 // CHECK-NEXT: spirv.ReturnValue [[RES]]43 spirv.ReturnValue %2 : f3244}45 46// -----47 48// CHECK-LABEL: func @clamp_fordlessthanequal49// 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 : f3253 %mid = spirv.Select %0, %min, %input : i1, f3254 %1 = spirv.FOrdLessThanEqual %max, %input : f3255 %2 = spirv.Select %1, %max, %mid : i1, f3256 57 // CHECK-NEXT: spirv.ReturnValue [[RES]]58 spirv.ReturnValue %2 : f3259}60 61// -----62 63// CHECK-LABEL: func @clamp_slessthan64// 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 : si3268 %mid = spirv.Select %0, %input, %min : i1, si3269 %1 = spirv.SLessThan %mid, %max : si3270 %2 = spirv.Select %1, %mid, %max : i1, si3271 72 // CHECK-NEXT: spirv.ReturnValue [[RES]]73 spirv.ReturnValue %2 : si3274}75 76// -----77 78// CHECK-LABEL: func @clamp_slessthan79// 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 : si3283 %mid = spirv.Select %0, %min, %input : i1, si3284 %1 = spirv.SLessThan %max, %input : si3285 %2 = spirv.Select %1, %max, %mid : i1, si3286 87 // CHECK-NEXT: spirv.ReturnValue [[RES]]88 spirv.ReturnValue %2 : si3289}90 91// -----92 93// CHECK-LABEL: func @clamp_slessthanequal94// 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 : si3298 %mid = spirv.Select %0, %input, %min : i1, si3299 %1 = spirv.SLessThanEqual %mid, %max : si32100 %2 = spirv.Select %1, %mid, %max : i1, si32101 102 // CHECK-NEXT: spirv.ReturnValue [[RES]]103 spirv.ReturnValue %2 : si32104}105 106// -----107 108// CHECK-LABEL: func @clamp_slessthanequal109// 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 : si32113 %mid = spirv.Select %0, %min, %input : i1, si32114 %1 = spirv.SLessThanEqual %max, %input : si32115 %2 = spirv.Select %1, %max, %mid : i1, si32116 117 // CHECK-NEXT: spirv.ReturnValue [[RES]]118 spirv.ReturnValue %2 : si32119}120 121// -----122 123// CHECK-LABEL: func @clamp_ulessthan124// 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 : i32128 %mid = spirv.Select %0, %input, %min : i1, i32129 %1 = spirv.ULessThan %mid, %max : i32130 %2 = spirv.Select %1, %mid, %max : i1, i32131 132 // CHECK-NEXT: spirv.ReturnValue [[RES]]133 spirv.ReturnValue %2 : i32134}135 136// -----137 138// CHECK-LABEL: func @clamp_ulessthan139// 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 : i32143 %mid = spirv.Select %0, %min, %input : i1, i32144 %1 = spirv.ULessThan %max, %input : i32145 %2 = spirv.Select %1, %max, %mid : i1, i32146 147 // CHECK-NEXT: spirv.ReturnValue [[RES]]148 spirv.ReturnValue %2 : i32149}150 151// -----152 153// CHECK-LABEL: func @clamp_ulessthanequal154// 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 : i32158 %mid = spirv.Select %0, %input, %min : i1, i32159 %1 = spirv.ULessThanEqual %mid, %max : i32160 %2 = spirv.Select %1, %mid, %max : i1, i32161 162 // CHECK-NEXT: spirv.ReturnValue [[RES]]163 spirv.ReturnValue %2 : i32164}165 166// -----167 168// CHECK-LABEL: func @clamp_ulessthanequal169// 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 : i32173 %mid = spirv.Select %0, %min, %input : i1, i32174 %1 = spirv.ULessThanEqual %max, %input : i32175 %2 = spirv.Select %1, %max, %mid : i1, i32176 177 // CHECK-NEXT: spirv.ReturnValue [[RES]]178 spirv.ReturnValue %2 : i32179}180