@@ -1010,6 +1010,100 @@ else:
1010
1010
ret i1 %res2
1011
1011
}
1012
1012
1013
+ define i1 @cttz_fold (i16 %x ) {
1014
+ ; CHECK-LABEL: @cttz_fold(
1015
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
1016
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
1017
+ ; CHECK: if:
1018
+ ; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X]], i1 true)
1019
+ ; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTTZ]], 8
1020
+ ; CHECK-NEXT: ret i1 [[RES]]
1021
+ ; CHECK: else:
1022
+ ; CHECK-NEXT: ret i1 false
1023
+ ;
1024
+ %cmp = icmp ult i16 %x , 256
1025
+ br i1 %cmp , label %if , label %else
1026
+
1027
+ if:
1028
+ %cttz = call i16 @llvm.cttz.i16 (i16 %x , i1 true )
1029
+ %res = icmp uge i16 %cttz , 8
1030
+ ret i1 %res
1031
+
1032
+ else:
1033
+ ret i1 false
1034
+ }
1035
+
1036
+ define i1 @cttz_nofold (i16 %x ) {
1037
+ ; CHECK-LABEL: @cttz_nofold(
1038
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
1039
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
1040
+ ; CHECK: if:
1041
+ ; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X]], i1 true)
1042
+ ; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTTZ]], 9
1043
+ ; CHECK-NEXT: ret i1 [[RES]]
1044
+ ; CHECK: else:
1045
+ ; CHECK-NEXT: ret i1 false
1046
+ ;
1047
+ %cmp = icmp ult i16 %x , 256
1048
+ br i1 %cmp , label %if , label %else
1049
+
1050
+ if:
1051
+ %cttz = call i16 @llvm.cttz.i16 (i16 %x , i1 true )
1052
+ %res = icmp uge i16 %cttz , 9
1053
+ ret i1 %res
1054
+
1055
+ else:
1056
+ ret i1 false
1057
+ }
1058
+
1059
+ define i1 @ctpop_fold (i16 %x ) {
1060
+ ; CHECK-LABEL: @ctpop_fold(
1061
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
1062
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
1063
+ ; CHECK: if:
1064
+ ; CHECK-NEXT: [[CTPOP:%.*]] = call i16 @llvm.ctpop.i16(i16 [[X]])
1065
+ ; CHECK-NEXT: [[RES:%.*]] = icmp ule i16 [[CTPOP]], 8
1066
+ ; CHECK-NEXT: ret i1 [[RES]]
1067
+ ; CHECK: else:
1068
+ ; CHECK-NEXT: ret i1 true
1069
+ ;
1070
+ %cmp = icmp ult i16 %x , 256
1071
+ br i1 %cmp , label %if , label %else
1072
+
1073
+ if:
1074
+ %ctpop = call i16 @llvm.ctpop.i16 (i16 %x )
1075
+ %res = icmp ule i16 %ctpop , 8
1076
+ ret i1 %res
1077
+
1078
+ else:
1079
+ ret i1 true
1080
+ }
1081
+
1082
+ define i1 @ctpop_nofold (i16 %x ) {
1083
+ ; CHECK-LABEL: @ctpop_nofold(
1084
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[X:%.*]], 256
1085
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
1086
+ ; CHECK: if:
1087
+ ; CHECK-NEXT: [[CTPOP:%.*]] = call i16 @llvm.ctpop.i16(i16 [[X]])
1088
+ ; CHECK-NEXT: [[RES:%.*]] = icmp ule i16 [[CTPOP]], 7
1089
+ ; CHECK-NEXT: ret i1 [[RES]]
1090
+ ; CHECK: else:
1091
+ ; CHECK-NEXT: ret i1 true
1092
+ ;
1093
+ %cmp = icmp ult i16 %x , 256
1094
+ br i1 %cmp , label %if , label %else
1095
+
1096
+ if:
1097
+ %ctpop = call i16 @llvm.ctpop.i16 (i16 %x )
1098
+ %res = icmp ule i16 %ctpop , 7
1099
+ ret i1 %res
1100
+
1101
+ else:
1102
+ ret i1 true
1103
+ }
1104
+
1013
1105
declare i16 @llvm.ctlz.i16 (i16 , i1 )
1106
+ declare i16 @llvm.cttz.i16 (i16 , i1 )
1107
+ declare i16 @llvm.ctpop.i16 (i16 )
1014
1108
declare i16 @llvm.abs.i16 (i16 , i1 )
1015
1109
declare void @llvm.assume (i1 )
0 commit comments