parent
							
								
									cbef26c6a8
								
							
						
					
					
						commit
						a2b6060c0c
					
				| 
						 | 
					@ -217,6 +217,7 @@ def HLO_LogisticOp: HLO_UnaryElementwiseOp<"logistic",
 | 
				
			||||||
def HLO_NotOp: HLO_UnaryElementwiseOp<"not",
 | 
					def HLO_NotOp: HLO_UnaryElementwiseOp<"not",
 | 
				
			||||||
    [NoSideEffect, SameOperandsAndResultType], HLO_PredOrIntTensor>,
 | 
					    [NoSideEffect, SameOperandsAndResultType], HLO_PredOrIntTensor>,
 | 
				
			||||||
    BASE_HLO_NotOp {
 | 
					    BASE_HLO_NotOp {
 | 
				
			||||||
 | 
					    let hasFolder = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def HLO_NegOp: HLO_UnaryElementwiseOp<"negate",
 | 
					def HLO_NegOp: HLO_UnaryElementwiseOp<"negate",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2195,6 +2195,12 @@ struct round {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct logical_not {
 | 
				
			||||||
 | 
					  APInt operator()(const APInt& i) {
 | 
				
			||||||
 | 
					    return APInt(i.getBitWidth(), static_cast<uint64_t>(!i));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UNARY_FOLDER(Op, Func)                                                \
 | 
					#define UNARY_FOLDER(Op, Func)                                                \
 | 
				
			||||||
  OpFoldResult Op::fold(ArrayRef<Attribute> attrs) {                          \
 | 
					  OpFoldResult Op::fold(ArrayRef<Attribute> attrs) {                          \
 | 
				
			||||||
    if (getElementTypeOrSelf(getType()).isa<FloatType>())                     \
 | 
					    if (getElementTypeOrSelf(getType()).isa<FloatType>())                     \
 | 
				
			||||||
| 
						 | 
					@ -2204,6 +2210,13 @@ struct round {
 | 
				
			||||||
    return {};                                                                \
 | 
					    return {};                                                                \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNARY_FOLDER_INT(Op, Func)                                   \
 | 
				
			||||||
 | 
					  OpFoldResult Op::fold(ArrayRef<Attribute> attrs) {                 \
 | 
				
			||||||
 | 
					    if (getElementTypeOrSelf(getType()).isa<IntegerType>())          \
 | 
				
			||||||
 | 
					      return UnaryFolder<Op, IntegerType, APInt, Func>(this, attrs); \
 | 
				
			||||||
 | 
					    return {};                                                       \
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define UNARY_FOLDER_FLOAT(Op, Func)                                 \
 | 
					#define UNARY_FOLDER_FLOAT(Op, Func)                                 \
 | 
				
			||||||
  OpFoldResult Op::fold(ArrayRef<Attribute> attrs) {                 \
 | 
					  OpFoldResult Op::fold(ArrayRef<Attribute> attrs) {                 \
 | 
				
			||||||
    if (getElementTypeOrSelf(getType()).isa<FloatType>())            \
 | 
					    if (getElementTypeOrSelf(getType()).isa<FloatType>())            \
 | 
				
			||||||
| 
						 | 
					@ -2212,8 +2225,13 @@ struct round {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UNARY_FOLDER(NegOp, std::negate);
 | 
					UNARY_FOLDER(NegOp, std::negate);
 | 
				
			||||||
 | 
					UNARY_FOLDER_INT(NotOp, logical_not);
 | 
				
			||||||
UNARY_FOLDER_FLOAT(RoundOp, round);
 | 
					UNARY_FOLDER_FLOAT(RoundOp, round);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef UNARY_FOLDER
 | 
				
			||||||
 | 
					#undef UNARY_FOLDER_INT
 | 
				
			||||||
 | 
					#undef UNARY_FOLDER_FLOAT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//===----------------------------------------------------------------------===//
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
// BinaryOps
 | 
					// BinaryOps
 | 
				
			||||||
//===----------------------------------------------------------------------===//
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1237,6 +1237,22 @@ func @fold_negate_float() -> tensor<4xf32> {
 | 
				
			||||||
  return %1 : tensor<4xf32>
 | 
					  return %1 : tensor<4xf32>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-LABEL func @fold_not()
 | 
				
			||||||
 | 
					func @fold_not() -> tensor<2x2xi1> {
 | 
				
			||||||
 | 
					  %0 = mhlo.constant dense<[[true, false], [true, false]]> : tensor<2x2xi1>
 | 
				
			||||||
 | 
					  // CHECK{LITERAL}: mhlo.constant dense<[[false, true], [false, true]]> : tensor<2x2xi1>
 | 
				
			||||||
 | 
					  %1 = "mhlo.not"(%0) : (tensor<2x2xi1>) -> tensor<2x2xi1>
 | 
				
			||||||
 | 
					  return %1 : tensor<2x2xi1>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CHECK-LABEL func @fold_not_i32()
 | 
				
			||||||
 | 
					func @fold_not_i32() -> tensor<2x2xi32> {
 | 
				
			||||||
 | 
					  %0 = mhlo.constant dense<[[42, -12], [1, 0]]> : tensor<2x2xi32>
 | 
				
			||||||
 | 
					  // CHECK-LITERAL: mhlo.constant dense<[[0, 0], [0, 1]]> : tensor<2x2xi32>
 | 
				
			||||||
 | 
					  %1 = "mhlo.not"(%0) : (tensor<2x2xi32>) -> tensor<2x2xi32>
 | 
				
			||||||
 | 
					  return %1 : tensor<2x2xi32>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CHECK-LABEL: func @fold_sqrt_f32_constants
 | 
					// CHECK-LABEL: func @fold_sqrt_f32_constants
 | 
				
			||||||
func @fold_sqrt_f32_constants() -> tensor<4xf32> {
 | 
					func @fold_sqrt_f32_constants() -> tensor<4xf32> {
 | 
				
			||||||
  %0 = mhlo.constant dense<1.0> : tensor<4xf32>
 | 
					  %0 = mhlo.constant dense<1.0> : tensor<4xf32>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue