@@ -94,9 +94,8 @@ class LLVM_ArithmeticOpBase<Type type, string mnemonic,
9494 LLVM_Builder<"$res = builder." # builderFunc # "($lhs, $rhs);"> {
9595 let arguments = (ins LLVM_ScalarOrVectorOf<type>:$lhs,
9696 LLVM_ScalarOrVectorOf<type>:$rhs);
97- let parser =
98- [{ return impl::parseOneResultSameOperandTypeOp(parser, result); }];
99- let printer = [{ mlir::impl::printOneResultOp(this->getOperation(), p); }];
97+ let results = (outs LLVM_ScalarOrVectorOf<type>:$res);
98+ let assemblyFormat = "$lhs `,` $rhs attr-dict `:` type($res)";
10099}
101100class LLVM_IntArithmeticOp<string mnemonic, string builderFunc,
102101 list<OpTrait> traits = []> :
@@ -112,9 +111,8 @@ class LLVM_UnaryArithmeticOp<Type type, string mnemonic,
112111 !listconcat([NoSideEffect, SameOperandsAndResultType], traits)>,
113112 LLVM_Builder<"$res = builder." # builderFunc # "($operand);"> {
114113 let arguments = (ins type:$operand);
115- let parser =
116- [{ return impl::parseOneResultSameOperandTypeOp(parser, result); }];
117- let printer = [{ mlir::impl::printOneResultOp(this->getOperation(), p); }];
114+ let results = (outs type:$res);
115+ let assemblyFormat = "$operand attr-dict `:` type($res)";
118116}
119117
120118// Integer binary operations.
@@ -157,6 +155,7 @@ def LLVM_ICmpOp : LLVM_OneResultOp<"icmp", [NoSideEffect]> {
157155 let arguments = (ins ICmpPredicate:$predicate,
158156 LLVM_ScalarOrVectorOf<LLVM_AnyInteger>:$lhs,
159157 LLVM_ScalarOrVectorOf<LLVM_AnyInteger>:$rhs);
158+ let results = (outs LLVM_ScalarOrVectorOf<LLVM_i1>:$res);
160159 let llvmBuilder = [{
161160 $res = builder.CreateICmp(getLLVMCmpPredicate($predicate), $lhs, $rhs);
162161 }];
@@ -204,6 +203,7 @@ def LLVM_FCmpOp : LLVM_OneResultOp<"fcmp", [NoSideEffect]> {
204203 let arguments = (ins FCmpPredicate:$predicate,
205204 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$lhs,
206205 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$rhs);
206+ let results = (outs LLVM_ScalarOrVectorOf<LLVM_i1>:$res);
207207 let llvmBuilder = [{
208208 $res = builder.CreateFCmp(getLLVMCmpPredicate($predicate), $lhs, $rhs);
209209 }];
@@ -257,6 +257,7 @@ def LLVM_AllocaOp :
257257 LLVM_OneResultOp<"alloca"> {
258258 let arguments = (ins LLVM_AnyInteger:$arraySize,
259259 OptionalAttr<I64Attr>:$alignment);
260+ let results = (outs LLVM_AnyPointer:$res);
260261 string llvmBuilder = [{
261262 auto *inst = builder.CreateAlloca(
262263 $_resultType->getPointerElementType(), $arraySize);
@@ -280,6 +281,7 @@ def LLVM_GEPOp : LLVM_OneResultOp<"getelementptr", [NoSideEffect]>,
280281 LLVM_Builder<"$res = builder.CreateGEP($base, $indices);"> {
281282 let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_AnyPointer>:$base,
282283 Variadic<LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>:$indices);
284+ let results = (outs LLVM_ScalarOrVectorOf<LLVM_AnyPointer>:$res);
283285 let assemblyFormat = [{
284286 $base `[` $indices `]` attr-dict `:` functional-type(operands, results)
285287 }];
@@ -291,6 +293,7 @@ def LLVM_LoadOp :
291293 let arguments = (ins LLVM_PointerTo<LLVM_LoadableType>:$addr,
292294 OptionalAttr<I64Attr>:$alignment, UnitAttr:$volatile_,
293295 UnitAttr:$nontemporal);
296+ let results = (outs LLVM_Type:$res);
294297 string llvmBuilder = [{
295298 auto *inst = builder.CreateLoad($addr, $volatile_);
296299 }] # setAlignmentCode # setNonTemporalMetadataCode # [{
@@ -330,52 +333,64 @@ def LLVM_StoreOp :
330333
331334// Casts.
332335class LLVM_CastOp<string mnemonic, string builderFunc, Type type,
333- list<OpTrait> traits = []> :
336+ Type resultType, list<OpTrait> traits = []> :
334337 LLVM_OneResultOp<mnemonic,
335338 !listconcat([NoSideEffect], traits)>,
336339 LLVM_Builder<"$res = builder." # builderFunc # "($arg, $_resultType);"> {
337340 let arguments = (ins type:$arg);
341+ let results = (outs resultType:$res);
338342 let parser = [{ return mlir::impl::parseCastOp(parser, result); }];
339343 let printer = [{ mlir::impl::printCastOp(this->getOperation(), p); }];
340344}
341345def LLVM_BitcastOp : LLVM_CastOp<"bitcast", "CreateBitCast",
342- LLVM_AnyNonAggregate>;
346+ LLVM_AnyNonAggregate, LLVM_AnyNonAggregate >;
343347def LLVM_AddrSpaceCastOp : LLVM_CastOp<"addrspacecast", "CreateAddrSpaceCast",
348+ LLVM_ScalarOrVectorOf<LLVM_AnyPointer>,
344349 LLVM_ScalarOrVectorOf<LLVM_AnyPointer>>;
345350def LLVM_IntToPtrOp : LLVM_CastOp<"inttoptr", "CreateIntToPtr",
346- LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
347- def LLVM_PtrToIntOp : LLVM_CastOp<"ptrtoint", "CreatePtrToInt",
351+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
348352 LLVM_ScalarOrVectorOf<LLVM_AnyPointer>>;
353+ def LLVM_PtrToIntOp : LLVM_CastOp<"ptrtoint", "CreatePtrToInt",
354+ LLVM_ScalarOrVectorOf<LLVM_AnyPointer>,
355+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
349356def LLVM_SExtOp : LLVM_CastOp<"sext", "CreateSExt",
357+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
350358 LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
351359def LLVM_ZExtOp : LLVM_CastOp<"zext", "CreateZExt",
360+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
352361 LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
353362def LLVM_TruncOp : LLVM_CastOp<"trunc", "CreateTrunc",
363+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
354364 LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
355365def LLVM_SIToFPOp : LLVM_CastOp<"sitofp", "CreateSIToFP",
356- LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
366+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
367+ LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
357368def LLVM_UIToFPOp : LLVM_CastOp<"uitofp", "CreateUIToFP",
358- LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
359- def LLVM_FPToSIOp : LLVM_CastOp<"fptosi", "CreateFPToSI",
369+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>,
360370 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
371+ def LLVM_FPToSIOp : LLVM_CastOp<"fptosi", "CreateFPToSI",
372+ LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
373+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
361374def LLVM_FPToUIOp : LLVM_CastOp<"fptoui", "CreateFPToUI",
362- LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
375+ LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
376+ LLVM_ScalarOrVectorOf<LLVM_AnyInteger>>;
363377def LLVM_FPExtOp : LLVM_CastOp<"fpext", "CreateFPExt",
378+ LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
364379 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
365380def LLVM_FPTruncOp : LLVM_CastOp<"fptrunc", "CreateFPTrunc",
381+ LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
366382 LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
367383
368384// Call-related operations.
369385def LLVM_InvokeOp : LLVM_Op<"invoke", [
370386 AttrSizedOperandSegments,
371387 DeclareOpInterfaceMethods<BranchOpInterface>,
372- Terminator
373- ]>,
374- Results<(outs Variadic<LLVM_Type>)> {
388+ Terminator]> {
375389 let arguments = (ins OptionalAttr<FlatSymbolRefAttr>:$callee,
376390 Variadic<LLVM_Type>:$operands,
377391 Variadic<LLVM_Type>:$normalDestOperands,
378392 Variadic<LLVM_Type>:$unwindDestOperands);
393+ let results = (outs Variadic<LLVM_Type>);
379394 let successors = (successor AnySuccessor:$normalDest,
380395 AnySuccessor:$unwindDest);
381396
@@ -400,15 +415,16 @@ def LLVM_InvokeOp : LLVM_Op<"invoke", [
400415
401416def LLVM_LandingpadOp : LLVM_OneResultOp<"landingpad"> {
402417 let arguments = (ins UnitAttr:$cleanup, Variadic<LLVM_Type>);
418+ let results = (outs LLVM_Type:$res);
403419 let verifier = [{ return ::verify(*this); }];
404420 let parser = [{ return parseLandingpadOp(parser, result); }];
405421 let printer = [{ printLandingpadOp(p, *this); }];
406422}
407423
408- def LLVM_CallOp : LLVM_Op<"call">,
409- Results<(outs Variadic<LLVM_Type>)> {
424+ def LLVM_CallOp : LLVM_Op<"call"> {
410425 let arguments = (ins OptionalAttr<FlatSymbolRefAttr>:$callee,
411426 Variadic<LLVM_Type>);
427+ let results = (outs Variadic<LLVM_Type>);
412428 let builders = [
413429 OpBuilderDAG<(ins "LLVMFuncOp":$func, "ValueRange":$operands,
414430 CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
@@ -426,6 +442,7 @@ def LLVM_CallOp : LLVM_Op<"call">,
426442}
427443def LLVM_ExtractElementOp : LLVM_OneResultOp<"extractelement", [NoSideEffect]> {
428444 let arguments = (ins LLVM_AnyVector:$vector, LLVM_AnyInteger:$position);
445+ let results = (outs LLVM_Type:$res);
429446 string llvmBuilder = [{
430447 $res = builder.CreateExtractElement($vector, $position);
431448 }];
@@ -437,6 +454,7 @@ def LLVM_ExtractElementOp : LLVM_OneResultOp<"extractelement", [NoSideEffect]> {
437454}
438455def LLVM_ExtractValueOp : LLVM_OneResultOp<"extractvalue", [NoSideEffect]> {
439456 let arguments = (ins LLVM_AnyAggregate:$container, ArrayAttr:$position);
457+ let results = (outs LLVM_Type:$res);
440458 string llvmBuilder = [{
441459 $res = builder.CreateExtractValue($container, extractPosition($position));
442460 }];
@@ -446,6 +464,7 @@ def LLVM_ExtractValueOp : LLVM_OneResultOp<"extractvalue", [NoSideEffect]> {
446464def LLVM_InsertElementOp : LLVM_OneResultOp<"insertelement", [NoSideEffect]> {
447465 let arguments = (ins LLVM_AnyVector:$vector, LLVM_PrimitiveType:$value,
448466 LLVM_AnyInteger:$position);
467+ let results = (outs LLVM_AnyVector:$res);
449468 string llvmBuilder = [{
450469 $res = builder.CreateInsertElement($vector, $value, $position);
451470 }];
@@ -455,6 +474,7 @@ def LLVM_InsertElementOp : LLVM_OneResultOp<"insertelement", [NoSideEffect]> {
455474def LLVM_InsertValueOp : LLVM_OneResultOp<"insertvalue", [NoSideEffect]> {
456475 let arguments = (ins LLVM_AnyAggregate:$container, LLVM_PrimitiveType:$value,
457476 ArrayAttr:$position);
477+ let results = (outs LLVM_AnyAggregate:$res);
458478 string llvmBuilder = [{
459479 $res = builder.CreateInsertValue($container, $value,
460480 extractPosition($position));
@@ -469,6 +489,7 @@ def LLVM_InsertValueOp : LLVM_OneResultOp<"insertvalue", [NoSideEffect]> {
469489}
470490def LLVM_ShuffleVectorOp : LLVM_OneResultOp<"shufflevector", [NoSideEffect]> {
471491 let arguments = (ins LLVM_AnyVector:$v1, LLVM_AnyVector:$v2, ArrayAttr:$mask);
492+ let results = (outs LLVM_AnyVector:$res);
472493 string llvmBuilder = [{
473494 SmallVector<unsigned, 4> position = extractPosition($mask);
474495 SmallVector<int, 4> mask(position.begin(), position.end());
@@ -499,6 +520,7 @@ def LLVM_SelectOp
499520 "$res = builder.CreateSelect($condition, $trueValue, $falseValue);"> {
500521 let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_i1>:$condition,
501522 LLVM_Type:$trueValue, LLVM_Type:$falseValue);
523+ let results = (outs LLVM_Type:$res);
502524 let builders = [
503525 OpBuilderDAG<(ins "Value":$condition, "Value":$lhs, "Value":$rhs),
504526 [{
@@ -508,6 +530,7 @@ def LLVM_SelectOp
508530}
509531def LLVM_FreezeOp : LLVM_OneResultOp<"freeze", [SameOperandsAndResultType]> {
510532 let arguments = (ins LLVM_Type:$val);
533+ let results = (outs LLVM_Type:$res);
511534 let assemblyFormat = "$val attr-dict `:` type($val)";
512535 string llvmBuilder = "builder.CreateFreeze($val);";
513536}
@@ -641,6 +664,7 @@ def Linkage : LLVM_EnumAttr<
641664
642665def LLVM_AddressOfOp : LLVM_OneResultOp<"mlir.addressof"> {
643666 let arguments = (ins FlatSymbolRefAttr:$global_name);
667+ let results = (outs LLVM_Type:$res);
644668
645669 let summary = "Creates a pointer pointing to a global or a function";
646670
@@ -796,25 +820,26 @@ def LLVM_NullOp
796820 : LLVM_OneResultOp<"mlir.null", [NoSideEffect]>,
797821 LLVM_Builder<"$res = llvm::ConstantPointerNull::get("
798822 " cast<llvm::PointerType>($_resultType));"> {
823+ let results = (outs LLVM_AnyPointer:$res);
799824 let assemblyFormat = "attr-dict `:` type($res)";
800- let verifier = [{ return ::verify(*this); }];
801825}
802826
803827def LLVM_UndefOp : LLVM_OneResultOp<"mlir.undef", [NoSideEffect]>,
804828 LLVM_Builder<"$res = llvm::UndefValue::get($_resultType);"> {
829+ let results = (outs LLVM_Type:$res);
805830 let assemblyFormat = "attr-dict `:` type($res)";
806831}
807832def LLVM_ConstantOp
808833 : LLVM_OneResultOp<"mlir.constant", [NoSideEffect]>,
809834 LLVM_Builder<"$res = getLLVMConstant($_resultType, $value, $_location);">
810835{
811836 let arguments = (ins AnyAttr:$value);
837+ let results = (outs LLVM_Type:$res);
812838 let assemblyFormat = "`(` $value `)` attr-dict `:` type($res)";
813839 let verifier = [{ return ::verify(*this); }];
814840}
815841
816- def LLVM_DialectCastOp : LLVM_Op<"mlir.cast", [NoSideEffect]>,
817- Results<(outs AnyType:$res)> {
842+ def LLVM_DialectCastOp : LLVM_Op<"mlir.cast", [NoSideEffect]> {
818843 let summary = "Type cast between LLVM dialect and Standard.";
819844 let description = [{
820845 llvm.mlir.cast op casts between Standard and LLVM dialects. It only changes
@@ -828,6 +853,7 @@ def LLVM_DialectCastOp : LLVM_Op<"mlir.cast", [NoSideEffect]>,
828853 llvm.mlir.cast %v : !llvm<"<2 x float>"> to vector<2xf32>
829854 }];
830855 let arguments = (ins AnyType:$in);
856+ let results = (outs AnyType:$res);
831857 let assemblyFormat = "$in attr-dict `:` type($in) `to` type($res)";
832858 let verifier = "return ::verify(*this);";
833859}
@@ -951,6 +977,7 @@ def LLVM_MatrixColumnMajorLoadOp
951977 : LLVM_OneResultOp<"intr.matrix.column.major.load"> {
952978 let arguments = (ins LLVM_Type:$data, LLVM_Type:$stride, I1Attr:$isVolatile,
953979 I32Attr:$rows, I32Attr:$columns);
980+ let results = (outs LLVM_Type:$res);
954981 string llvmBuilder = [{
955982 llvm::MatrixBuilder<decltype(builder)> mb(builder);
956983 const llvm::DataLayout &dl =
@@ -997,6 +1024,7 @@ def LLVM_MatrixMultiplyOp
9971024 : LLVM_OneResultOp<"intr.matrix.multiply"> {
9981025 let arguments = (ins LLVM_Type:$lhs, LLVM_Type:$rhs, I32Attr:$lhs_rows,
9991026 I32Attr:$lhs_columns, I32Attr:$rhs_columns);
1027+ let results = (outs LLVM_Type:$res);
10001028 string llvmBuilder = [{
10011029 llvm::MatrixBuilder<decltype(builder)> mb(builder);
10021030 $res = mb.CreateMatrixMultiply(
@@ -1011,6 +1039,7 @@ def LLVM_MatrixMultiplyOp
10111039/// `matrix`, as specified in the LLVM MatrixBuilder.
10121040def LLVM_MatrixTransposeOp : LLVM_OneResultOp<"intr.matrix.transpose"> {
10131041 let arguments = (ins LLVM_Type:$matrix, I32Attr:$rows, I32Attr:$columns);
1042+ let results = (outs LLVM_Type:$res);
10141043 string llvmBuilder = [{
10151044 llvm::MatrixBuilder<decltype(builder)> mb(builder);
10161045 $res = mb.CreateMatrixTranspose(
@@ -1035,6 +1064,7 @@ def LLVM_GetActiveLaneMaskOp
10351064def LLVM_MaskedLoadOp : LLVM_OneResultOp<"intr.masked.load"> {
10361065 let arguments = (ins LLVM_Type:$data, LLVM_Type:$mask,
10371066 Variadic<LLVM_Type>:$pass_thru, I32Attr:$alignment);
1067+ let results = (outs LLVM_Type:$res);
10381068 string llvmBuilder = [{
10391069 $res = $pass_thru.empty() ? builder.CreateMaskedLoad(
10401070 $data, llvm::Align($alignment), $mask) :
@@ -1061,6 +1091,7 @@ def LLVM_MaskedStoreOp : LLVM_ZeroResultOp<"intr.masked.store"> {
10611091def LLVM_masked_gather : LLVM_OneResultOp<"intr.masked.gather"> {
10621092 let arguments = (ins LLVM_Type:$ptrs, LLVM_Type:$mask,
10631093 Variadic<LLVM_Type>:$pass_thru, I32Attr:$alignment);
1094+ let results = (outs LLVM_Type:$res);
10641095 string llvmBuilder = [{
10651096 $res = $pass_thru.empty() ? builder.CreateMaskedGather(
10661097 $ptrs, llvm::Align($alignment), $mask) :
@@ -1139,11 +1170,11 @@ def AtomicOrdering : I64EnumAttr<
11391170
11401171def LLVM_AtomicRMWType : AnyTypeOf<[LLVM_AnyFloat, LLVM_AnyInteger]>;
11411172
1142- def LLVM_AtomicRMWOp : LLVM_Op<"atomicrmw">,
1143- Results<(outs LLVM_Type:$res)> {
1173+ def LLVM_AtomicRMWOp : LLVM_Op<"atomicrmw"> {
11441174 let arguments = (ins AtomicBinOp:$bin_op,
11451175 LLVM_PointerTo<LLVM_AtomicRMWType>:$ptr,
11461176 LLVM_AtomicRMWType:$val, AtomicOrdering:$ordering);
1177+ let results = (outs LLVM_AtomicRMWType:$res);
11471178 let llvmBuilder = [{
11481179 $res = builder.CreateAtomicRMW(getLLVMAtomicBinOp($bin_op), $ptr, $val,
11491180 getLLVMAtomicOrdering($ordering));
@@ -1154,12 +1185,24 @@ def LLVM_AtomicRMWOp : LLVM_Op<"atomicrmw">,
11541185}
11551186
11561187def LLVM_AtomicCmpXchgType : AnyTypeOf<[LLVM_AnyInteger, LLVM_AnyPointer]>;
1157-
1158- def LLVM_AtomicCmpXchgOp : LLVM_Op<"cmpxchg">, Results<(outs LLVM_Type:$res)> {
1188+ def LLVM_AtomicCmpXchgResultType : Type<And<[
1189+ LLVM_AnyStruct.predicate,
1190+ CPred<"$_self.cast<::mlir::LLVM::LLVMStructType>().getBody().size() == 2">,
1191+ SubstLeaves<"$_self",
1192+ "$_self.cast<::mlir::LLVM::LLVMStructType>().getBody()[0]",
1193+ LLVM_AtomicCmpXchgType.predicate>,
1194+ SubstLeaves<"$_self",
1195+ "$_self.cast<::mlir::LLVM::LLVMStructType>().getBody()[1]",
1196+ LLVM_i1.predicate>]>,
1197+ "an LLVM struct type with any integer or pointer followed by a single-bit "
1198+ "integer">;
1199+
1200+ def LLVM_AtomicCmpXchgOp : LLVM_Op<"cmpxchg"> {
11591201 let arguments = (ins LLVM_PointerTo<LLVM_AtomicCmpXchgType>:$ptr,
11601202 LLVM_AtomicCmpXchgType:$cmp, LLVM_AtomicCmpXchgType:$val,
11611203 AtomicOrdering:$success_ordering,
11621204 AtomicOrdering:$failure_ordering);
1205+ let results = (outs LLVM_AtomicCmpXchgResultType:$res);
11631206 let llvmBuilder = [{
11641207 $res = builder.CreateAtomicCmpXchg($ptr, $cmp, $val,
11651208 getLLVMAtomicOrdering($success_ordering),
0 commit comments