104 lines · plain
1// RUN: mlir-opt -test-trait-folder %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// Test that involutions fold correctly5//===----------------------------------------------------------------------===//6 7// CHECK-LABEL: func @testSingleInvolution8// CHECK-SAME: ([[ARG0:%.+]]: i32)9func.func @testSingleInvolution(%arg0 : i32) -> i32 {10 // CHECK: [[INVOLUTION:%.+]] = "test.op_involution_trait_no_operation_fold"([[ARG0]])11 %0 = "test.op_involution_trait_no_operation_fold"(%arg0) : (i32) -> i3212 // CHECK: return [[INVOLUTION]]13 return %0: i3214}15 16// CHECK-LABEL: func @testDoubleInvolution17// CHECK-SAME: ([[ARG0:%.+]]: i32)18func.func @testDoubleInvolution(%arg0: i32) -> i32 {19 %0 = "test.op_involution_trait_no_operation_fold"(%arg0) : (i32) -> i3220 %1 = "test.op_involution_trait_no_operation_fold"(%0) : (i32) -> i3221 // CHECK: return [[ARG0]]22 return %1: i3223}24 25// CHECK-LABEL: func @testTripleInvolution26// CHECK-SAME: ([[ARG0:%.+]]: i32)27func.func @testTripleInvolution(%arg0: i32) -> i32 {28 // CHECK: [[INVOLUTION:%.+]] = "test.op_involution_trait_no_operation_fold"([[ARG0]])29 %0 = "test.op_involution_trait_no_operation_fold"(%arg0) : (i32) -> i3230 %1 = "test.op_involution_trait_no_operation_fold"(%0) : (i32) -> i3231 %2 = "test.op_involution_trait_no_operation_fold"(%1) : (i32) -> i3232 // CHECK: return [[INVOLUTION]]33 return %2: i3234}35 36//===----------------------------------------------------------------------===//37// Test that involutions fold occurs if operation fold fails38//===----------------------------------------------------------------------===//39 40// CHECK-LABEL: func @testFailingOperationFolder41// CHECK-SAME: ([[ARG0:%.+]]: i32)42func.func @testFailingOperationFolder(%arg0: i32) -> i32 {43 %0 = "test.op_involution_trait_failing_operation_fold"(%arg0) : (i32) -> i3244 %1 = "test.op_involution_trait_failing_operation_fold"(%0) : (i32) -> i3245 // CHECK: return [[ARG0]]46 return %1: i3247}48 49//===----------------------------------------------------------------------===//50// Test that involution fold does not occur if operation fold succeeds51//===----------------------------------------------------------------------===//52 53// CHECK-LABEL: func @testInhibitInvolution54// CHECK-SAME: ([[ARG0:%.+]]: i32)55func.func @testInhibitInvolution(%arg0: i32) -> i32 {56 // CHECK: [[OP:%.+]] = "test.op_involution_trait_succesful_operation_fold"([[ARG0]])57 %0 = "test.op_involution_trait_succesful_operation_fold"(%arg0) : (i32) -> i3258 %1 = "test.op_involution_trait_succesful_operation_fold"(%0) : (i32) -> i3259 // CHECK: return [[OP]]60 return %1: i3261}62 63//===----------------------------------------------------------------------===//64// Test that idempotent folding works correctly65//===----------------------------------------------------------------------===//66 67// CHECK-LABEL: func @testSingleIdempotent68// CHECK-SAME: ([[ARG0:%.+]]: i32)69func.func @testSingleIdempotent(%arg0 : i32) -> i32 {70 // CHECK: [[IDEMPOTENT:%.+]] = "test.op_idempotent_trait"([[ARG0]])71 %0 = "test.op_idempotent_trait"(%arg0) : (i32) -> i3272 // CHECK: return [[IDEMPOTENT]]73 return %0: i3274}75 76// CHECK-LABEL: func @testDoubleIdempotent77// CHECK-SAME: ([[ARG0:%.+]]: i32)78func.func @testDoubleIdempotent(%arg0: i32) -> i32 {79 // CHECK: [[IDEMPOTENT:%.+]] = "test.op_idempotent_trait"([[ARG0]])80 %0 = "test.op_idempotent_trait"(%arg0) : (i32) -> i3281 %1 = "test.op_idempotent_trait"(%0) : (i32) -> i3282 // CHECK: return [[IDEMPOTENT]]83 return %1: i3284}85 86// CHECK-LABEL: func @testTripleIdempotent87// CHECK-SAME: ([[ARG0:%.+]]: i32)88func.func @testTripleIdempotent(%arg0: i32) -> i32 {89 // CHECK: [[IDEMPOTENT:%.+]] = "test.op_idempotent_trait"([[ARG0]])90 %0 = "test.op_idempotent_trait"(%arg0) : (i32) -> i3291 %1 = "test.op_idempotent_trait"(%0) : (i32) -> i3292 %2 = "test.op_idempotent_trait"(%1) : (i32) -> i3293 // CHECK: return [[IDEMPOTENT]]94 return %2: i3295}96 97// CHECK-LABEL: func @testBinaryIdempotent98// CHECK-SAME: ([[ARG0:%.+]]: i32)99func.func @testBinaryIdempotent(%arg0 : i32) -> i32 {100 %0 = "test.op_idempotent_trait_binary"(%arg0, %arg0) : (i32, i32) -> i32101 // CHECK: return [[ARG0]]102 return %0: i32103}104