@@ -1006,6 +1006,102 @@ func.func @umod_fail_fold(%arg0: i32) -> (i32, i32) {
1006
1006
1007
1007
// -----
1008
1008
1009
+ //===----------------------------------------------------------------------===//
1010
+ // spirv.SNegate
1011
+ //===----------------------------------------------------------------------===//
1012
+
1013
+ // CHECK-LABEL: @snegate_twice
1014
+ // CHECK-SAME: (%[[ARG:.*]]: i32)
1015
+ func.func @snegate_twice (%arg0 : i32 ) -> i32 {
1016
+ %0 = spirv.SNegate %arg0 : i32
1017
+ %1 = spirv.SNegate %0 : i32
1018
+
1019
+ // CHECK: return %[[ARG]] : i32
1020
+ return %1 : i32
1021
+ }
1022
+
1023
+ // CHECK-LABEL: @snegate_min
1024
+ func.func @snegate_min () -> (i8 , i8 ) {
1025
+ // CHECK: %[[MIN:.*]] = spirv.Constant -128 : i8
1026
+ %cmin = spirv.Constant -128 : i8
1027
+
1028
+ %0 = spirv.SNegate %cmin : i8
1029
+ %1 = spirv.SNegate %0 : i8
1030
+
1031
+ // CHECK: return %[[MIN]], %[[MIN]]
1032
+ return %0 , %1 : i8 , i8
1033
+ }
1034
+
1035
+ // CHECK-LABEL: @const_fold_scalar_snegate
1036
+ func.func @const_fold_scalar_snegate () -> (i32 , i32 , i32 ) {
1037
+ %c0 = spirv.Constant 0 : i32
1038
+ %c3 = spirv.Constant 3 : i32
1039
+ %cn3 = spirv.Constant -3 : i32
1040
+
1041
+ // CHECK-DAG: %[[THREE:.*]] = spirv.Constant 3 : i32
1042
+ // CHECK-DAG: %[[NTHREE:.*]] = spirv.Constant -3 : i32
1043
+ // CHECK-DAG: %[[ZERO:.*]] = spirv.Constant 0 : i32
1044
+ %0 = spirv.SNegate %c0 : i32
1045
+ %1 = spirv.SNegate %c3 : i32
1046
+ %2 = spirv.SNegate %cn3 : i32
1047
+
1048
+ // CHECK: return %[[ZERO]], %[[NTHREE]], %[[THREE]]
1049
+ return %0 , %1 , %2 : i32 , i32 , i32
1050
+ }
1051
+
1052
+ // CHECK-LABEL: @const_fold_vector_snegate
1053
+ func.func @const_fold_vector_snegate () -> vector <3 xi32 > {
1054
+ // CHECK: spirv.Constant dense<[0, 3, -3]>
1055
+ %cv = spirv.Constant dense <[0 , -3 , 3 ]> : vector <3 xi32 >
1056
+ %0 = spirv.SNegate %cv : vector <3 xi32 >
1057
+ return %0 : vector <3 xi32 >
1058
+ }
1059
+
1060
+ // -----
1061
+
1062
+ //===----------------------------------------------------------------------===//
1063
+ // spirv.Not
1064
+ //===----------------------------------------------------------------------===//
1065
+
1066
+ // CHECK-LABEL: @not_twice
1067
+ // CHECK-SAME: (%[[ARG:.*]]: i32)
1068
+ func.func @not_twice (%arg0 : i32 ) -> i32 {
1069
+ %0 = spirv.Not %arg0 : i32
1070
+ %1 = spirv.Not %0 : i32
1071
+
1072
+ // CHECK: return %[[ARG]] : i32
1073
+ return %1 : i32
1074
+ }
1075
+
1076
+ // CHECK-LABEL: @const_fold_scalar_not
1077
+ func.func @const_fold_scalar_not () -> (i32 , i32 , i32 ) {
1078
+ %c0 = spirv.Constant 0 : i32
1079
+ %c3 = spirv.Constant 3 : i32
1080
+ %cn3 = spirv.Constant -3 : i32
1081
+
1082
+ // CHECK-DAG: %[[TWO:.*]] = spirv.Constant 2 : i32
1083
+ // CHECK-DAG: %[[NFOUR:.*]] = spirv.Constant -4 : i32
1084
+ // CHECK-DAG: %[[NONE:.*]] = spirv.Constant -1 : i32
1085
+ %0 = spirv.Not %c0 : i32
1086
+ %1 = spirv.Not %c3 : i32
1087
+ %2 = spirv.Not %cn3 : i32
1088
+
1089
+ // CHECK: return %[[NONE]], %[[NFOUR]], %[[TWO]]
1090
+ return %0 , %1 , %2 : i32 , i32 , i32
1091
+ }
1092
+
1093
+ // CHECK-LABEL: @const_fold_vector_not
1094
+ func.func @const_fold_vector_not () -> vector <3 xi32 > {
1095
+ %cv = spirv.Constant dense <[-1 , -4 , 2 ]> : vector <3 xi32 >
1096
+
1097
+ // CHECK: spirv.Constant dense<[0, 3, -3]>
1098
+ %0 = spirv.Not %cv : vector <3 xi32 >
1099
+
1100
+ return %0 : vector <3 xi32 >
1101
+ }
1102
+
1103
+ // -----
1104
+
1009
1105
//===----------------------------------------------------------------------===//
1010
1106
// spirv.LogicalAnd
1011
1107
//===----------------------------------------------------------------------===//
@@ -1040,6 +1136,38 @@ func.func @convert_logical_and_true_false_vector(%arg: vector<3xi1>) -> (vector<
1040
1136
// spirv.LogicalNot
1041
1137
//===----------------------------------------------------------------------===//
1042
1138
1139
+ // CHECK-LABEL: @logical_not_twice
1140
+ // CHECK-SAME: (%[[ARG:.*]]: i1)
1141
+ func.func @logical_not_twice (%arg0 : i1 ) -> i1 {
1142
+ %0 = spirv.LogicalNot %arg0 : i1
1143
+ %1 = spirv.LogicalNot %0 : i1
1144
+
1145
+ // CHECK: return %[[ARG]] : i1
1146
+ return %1 : i1
1147
+ }
1148
+
1149
+ // CHECK-LABEL: @const_fold_scalar_logical_not
1150
+ func.func @const_fold_scalar_logical_not () -> i1 {
1151
+ %true = spirv.Constant true
1152
+
1153
+ // CHECK: spirv.Constant false
1154
+ %0 = spirv.LogicalNot %true : i1
1155
+
1156
+ return %0 : i1
1157
+ }
1158
+
1159
+ // CHECK-LABEL: @const_fold_vector_logical_not
1160
+ func.func @const_fold_vector_logical_not () -> vector <2 xi1 > {
1161
+ %cv = spirv.Constant dense <[true , false ]> : vector <2 xi1 >
1162
+
1163
+ // CHECK: spirv.Constant dense<[false, true]>
1164
+ %0 = spirv.LogicalNot %cv : vector <2 xi1 >
1165
+
1166
+ return %0 : vector <2 xi1 >
1167
+ }
1168
+
1169
+ // -----
1170
+
1043
1171
func.func @convert_logical_not_to_not_equal (%arg0: vector <3 xi64 >, %arg1: vector <3 xi64 >) -> vector <3 xi1 > {
1044
1172
// CHECK: %[[RESULT:.*]] = spirv.INotEqual {{%.*}}, {{%.*}} : vector<3xi64>
1045
1173
// CHECK-NEXT: spirv.ReturnValue %[[RESULT]] : vector<3xi1>
0 commit comments