Skip to content

Commit e2f0826

Browse files
authored
[MLIR] Fix LLVM dialect specification to use AnySignlessInteger instead of AnyInteger (llvm#82694)
LLVM IR does not support signed integer, the LLVM dialect was underspecified (likely unintentionally) and the AnyInteger constraint was overly lax. The arithmetic dialect is already consistently using AnySignlessInteger.
1 parent ae3e142 commit e2f0826

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ class LLVM_ArithmeticOpBase<Type type, string mnemonic,
4949
}
5050
class LLVM_IntArithmeticOp<string mnemonic, string instName,
5151
list<Trait> traits = []> :
52-
LLVM_ArithmeticOpBase<AnyInteger, mnemonic, instName, traits> {
52+
LLVM_ArithmeticOpBase<AnySignlessInteger, mnemonic, instName, traits> {
5353
let arguments = commonArgs;
5454
string mlirBuilder = [{
5555
$res = $_builder.create<$_qualCppClassName>($_location, $lhs, $rhs);
5656
}];
5757
}
5858
class LLVM_IntArithmeticOpWithOverflowFlag<string mnemonic, string instName,
5959
list<Trait> traits = []> :
60-
LLVM_ArithmeticOpBase<AnyInteger, mnemonic, instName,
60+
LLVM_ArithmeticOpBase<AnySignlessInteger, mnemonic, instName,
6161
!listconcat([DeclareOpInterfaceMethods<IntegerOverflowFlagsInterface>], traits)> {
6262
dag iofArg = (
6363
ins DefaultValuedAttr<LLVM_IntegerOverflowFlagsAttr, "{}">:$overflowFlags);
@@ -143,9 +143,9 @@ class LLVM_ArithmeticCmpOp<string mnemonic, list<Trait> traits = []> :
143143
// Other integer operations.
144144
def LLVM_ICmpOp : LLVM_ArithmeticCmpOp<"icmp", [Pure]> {
145145
let arguments = (ins ICmpPredicate:$predicate,
146-
AnyTypeOf<[LLVM_ScalarOrVectorOf<AnyInteger>,
146+
AnyTypeOf<[LLVM_ScalarOrVectorOf<AnySignlessInteger>,
147147
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>]>:$lhs,
148-
AnyTypeOf<[LLVM_ScalarOrVectorOf<AnyInteger>,
148+
AnyTypeOf<[LLVM_ScalarOrVectorOf<AnySignlessInteger>,
149149
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>]>:$rhs);
150150
let hasCustomAssemblyFormat = 1;
151151
string llvmInstName = "ICmp";
@@ -204,7 +204,7 @@ def LLVM_AllocaOp : LLVM_Op<"alloca",
204204
DeclareOpInterfaceMethods<DestructurableAllocationOpInterface>,
205205
DeclareOpInterfaceMethods<GetResultPtrElementType>]>,
206206
LLVM_MemOpPatterns {
207-
let arguments = (ins AnyInteger:$arraySize,
207+
let arguments = (ins AnySignlessInteger:$arraySize,
208208
OptionalAttr<I64Attr>:$alignment,
209209
TypeAttr:$elem_type,
210210
UnitAttr:$inalloca);
@@ -250,7 +250,7 @@ def LLVM_GEPOp : LLVM_Op<"getelementptr", [Pure,
250250
DeclareOpInterfaceMethods<DestructurableAccessorOpInterface>,
251251
DeclareOpInterfaceMethods<GetResultPtrElementType>]> {
252252
let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_AnyPointer>:$base,
253-
Variadic<LLVM_ScalarOrVectorOf<AnyInteger>>:$dynamicIndices,
253+
Variadic<LLVM_ScalarOrVectorOf<AnySignlessInteger>>:$dynamicIndices,
254254
DenseI32ArrayAttr:$rawConstantIndices,
255255
TypeAttr:$elem_type,
256256
UnitAttr:$inbounds);
@@ -499,37 +499,37 @@ def LLVM_AddrSpaceCastOp : LLVM_CastOp<"addrspacecast", "AddrSpaceCast",
499499
let hasFolder = 1;
500500
}
501501
def LLVM_IntToPtrOp : LLVM_CastOp<"inttoptr", "IntToPtr",
502-
LLVM_ScalarOrVectorOf<AnyInteger>,
502+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
503503
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>>;
504504
def LLVM_PtrToIntOp : LLVM_CastOp<"ptrtoint", "PtrToInt",
505505
LLVM_ScalarOrVectorOf<LLVM_AnyPointer>,
506-
LLVM_ScalarOrVectorOf<AnyInteger>>;
506+
LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
507507
def LLVM_SExtOp : LLVM_CastOp<"sext", "SExt",
508-
LLVM_ScalarOrVectorOf<AnyInteger>,
509-
LLVM_ScalarOrVectorOf<AnyInteger>> {
508+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
509+
LLVM_ScalarOrVectorOf<AnySignlessInteger>> {
510510
let hasVerifier = 1;
511511
}
512512
def LLVM_ZExtOp : LLVM_CastOp<"zext", "ZExt",
513-
LLVM_ScalarOrVectorOf<AnyInteger>,
514-
LLVM_ScalarOrVectorOf<AnyInteger>> {
513+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
514+
LLVM_ScalarOrVectorOf<AnySignlessInteger>> {
515515
let hasFolder = 1;
516516
let hasVerifier = 1;
517517
}
518518
def LLVM_TruncOp : LLVM_CastOp<"trunc", "Trunc",
519-
LLVM_ScalarOrVectorOf<AnyInteger>,
520-
LLVM_ScalarOrVectorOf<AnyInteger>>;
519+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
520+
LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
521521
def LLVM_SIToFPOp : LLVM_CastOp<"sitofp", "SIToFP",
522-
LLVM_ScalarOrVectorOf<AnyInteger>,
522+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
523523
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
524524
def LLVM_UIToFPOp : LLVM_CastOp<"uitofp", "UIToFP",
525-
LLVM_ScalarOrVectorOf<AnyInteger>,
525+
LLVM_ScalarOrVectorOf<AnySignlessInteger>,
526526
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
527527
def LLVM_FPToSIOp : LLVM_CastOp<"fptosi", "FPToSI",
528528
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
529-
LLVM_ScalarOrVectorOf<AnyInteger>>;
529+
LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
530530
def LLVM_FPToUIOp : LLVM_CastOp<"fptoui", "FPToUI",
531531
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
532-
LLVM_ScalarOrVectorOf<AnyInteger>>;
532+
LLVM_ScalarOrVectorOf<AnySignlessInteger>>;
533533
def LLVM_FPExtOp : LLVM_CastOp<"fpext", "FPExt",
534534
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>,
535535
LLVM_ScalarOrVectorOf<LLVM_AnyFloat>>;
@@ -671,7 +671,7 @@ def LLVM_ExtractElementOp : LLVM_Op<"extractelement", [Pure,
671671
"LLVM::getVectorElementType($_self)">]> {
672672
let summary = "Extract an element from an LLVM vector.";
673673

674-
let arguments = (ins LLVM_AnyVector:$vector, AnyInteger:$position);
674+
let arguments = (ins LLVM_AnyVector:$vector, AnySignlessInteger:$position);
675675
let results = (outs LLVM_Type:$res);
676676

677677
let assemblyFormat = [{
@@ -733,7 +733,7 @@ def LLVM_InsertElementOp : LLVM_Op<"insertelement", [Pure,
733733
let summary = "Insert an element into an LLVM vector.";
734734

735735
let arguments = (ins LLVM_AnyVector:$vector, LLVM_PrimitiveType:$value,
736-
AnyInteger:$position);
736+
AnySignlessInteger:$position);
737737
let results = (outs LLVM_AnyVector:$res);
738738

739739
let builders = [LLVM_OneResultOpBuilder];
@@ -971,7 +971,7 @@ def LLVM_SwitchOp : LLVM_TerminatorOp<"switch",
971971
DeclareOpInterfaceMethods<BranchWeightOpInterface>,
972972
Pure]> {
973973
let arguments = (ins
974-
AnyInteger:$value,
974+
AnySignlessInteger:$value,
975975
Variadic<AnyType>:$defaultOperands,
976976
VariadicOfVariadic<AnyType, "case_operand_segments">:$caseOperands,
977977
OptionalAttr<AnyIntElementsAttr>:$case_values,
@@ -1647,7 +1647,7 @@ def LLVM_ConstantOp
16471647
// Atomic operations.
16481648
//
16491649

1650-
def LLVM_AtomicRMWType : AnyTypeOf<[LLVM_AnyFloat, LLVM_AnyPointer, AnyInteger]>;
1650+
def LLVM_AtomicRMWType : AnyTypeOf<[LLVM_AnyFloat, LLVM_AnyPointer, AnySignlessInteger]>;
16511651

16521652
def LLVM_AtomicRMWOp : LLVM_MemAccessOpBase<"atomicrmw", [
16531653
TypesMatchWith<"result #0 and operand #1 have the same type",
@@ -1696,7 +1696,7 @@ def LLVM_AtomicRMWOp : LLVM_MemAccessOpBase<"atomicrmw", [
16961696
let hasVerifier = 1;
16971697
}
16981698

1699-
def LLVM_AtomicCmpXchgType : AnyTypeOf<[AnyInteger, LLVM_AnyPointer]>;
1699+
def LLVM_AtomicCmpXchgType : AnyTypeOf<[AnySignlessInteger, LLVM_AnyPointer]>;
17001700

17011701
def LLVM_AtomicCmpXchgOp : LLVM_MemAccessOpBase<"cmpxchg", [
17021702
TypesMatchWith<"operand #1 and operand #2 have the same type",

0 commit comments

Comments
 (0)