233 lines · plain
1// RUN: cir-opt -cir-canonicalize -cir-simplify -o %t.cir %s2// RUN: FileCheck --input-file=%t.cir %s3 4!s32i = !cir.int<s, 32>5!u32i = !cir.int<u, 32>6 7module {8 cir.func @fold_clrsb() -> !s32i {9 %0 = cir.const #cir.int<1> : !s32i10 %1 = cir.clrsb %0 : !s32i11 cir.return %1 : !s32i12 }13 // CHECK-LABEL: @fold_clrsb14 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<30> : !s32i15 // CHECK-NEXT: cir.return %[[R]] : !s32i16 // CHECK-NEXT: }17 18 cir.func @fold_clz() -> !u32i {19 %0 = cir.const #cir.int<1> : !u32i20 %1 = cir.clz %0 : !u32i21 cir.return %1 : !u32i22 }23 // CHECK-LABEL: @fold_clz24 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<31> : !u32i25 // CHECK-NEXT: cir.return %[[R]] : !u32i26 // CHECK-NEXT: }27 28 cir.func @fold_clz_zero_poison() -> !u32i {29 %0 = cir.const #cir.int<0> : !u32i30 %1 = cir.clz %0 poison_zero : !u32i31 cir.return %1 : !u32i32 }33 // CHECK-LABEL: @fold_clz_zero_poison34 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.poison : !u32i35 // CHECK-NEXT: cir.return %[[R]] : !u32i36 // CHECK-NEXT: }37 38 cir.func @fold_clz_zero_no_poison() -> !u32i {39 %0 = cir.const #cir.int<0> : !u32i40 %1 = cir.clz %0 : !u32i41 cir.return %1 : !u32i42 }43 // CHECK-LABEL: @fold_clz_zero_no_poison44 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<32> : !u32i45 // CHECK-NEXT: cir.return %[[R]] : !u32i46 // CHECK-NEXT: }47 48 cir.func @fold_ctz() -> !u32i {49 %0 = cir.const #cir.int<2> : !u32i50 %1 = cir.ctz %0 : !u32i51 cir.return %1 : !u32i52 }53 // CHECK-LABEL: @fold_ctz54 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<1> : !u32i55 // CHECK-NEXT: cir.return %[[R]] : !u32i56 // CHECK-NEXT: }57 58 cir.func @fold_ctz_zero_poison() -> !u32i {59 %0 = cir.const #cir.int<0> : !u32i60 %1 = cir.ctz %0 poison_zero : !u32i61 cir.return %1 : !u32i62 }63 // CHECK-LABEL: @fold_ctz_zero_poison64 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.poison : !u32i65 // CHECK-NEXT: cir.return %[[R]] : !u32i66 // CHECK-NEXT: }67 68 cir.func @fold_ctz_zero_no_poison() -> !u32i {69 %0 = cir.const #cir.int<0> : !u32i70 %1 = cir.ctz %0 : !u32i71 cir.return %1 : !u32i72 }73 // CHECK-LABEL: @fold_ctz_zero_no_poison74 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<32> : !u32i75 // CHECK-NEXT: cir.return %[[R]] : !u32i76 // CHECK-NEXT: }77 78 cir.func @fold_ffs() -> !s32i {79 // 40 is 0b0010_100080 %0 = cir.const #cir.int<40> : !s32i81 %1 = cir.ffs %0 : !s32i82 cir.return %1 : !s32i83 }84 // CHECK-LABEL: @fold_ffs85 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<4> : !s32i86 // CHECK-NEXT: cir.return %[[R]] : !s32i87 // CHECK-NEXT: }88 89 cir.func @fold_ffs_zero() -> !s32i {90 %0 = cir.const #cir.int<0> : !s32i91 %1 = cir.ffs %0 : !s32i92 cir.return %1 : !s32i93 }94 // CHECK-LABEL: @fold_ffs_zero95 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<0> : !s32i96 // CHECK-NEXT: cir.return %[[R]] : !s32i97 // CHECK-NEXT: }98 99 cir.func @fold_parity() -> !u32i {100 // 0xdeadbeef is 0b1101_1110_1010_1101_1011_1110_1110_1111101 // 0xdeadbeef contains 24 ones102 %0 = cir.const #cir.int<0xdeadbeef> : !u32i103 %1 = cir.parity %0 : !u32i104 cir.return %1 : !u32i105 }106 // CHECK-LABEL: @fold_parity107 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<0> : !u32i108 // CHECK-NEXT: cir.return %[[R]] : !u32i109 // CHECK-NEXT: }110 111 cir.func @fold_popcount() -> !u32i {112 // 0xdeadbeef is 0b1101_1110_1010_1101_1011_1110_1110_1111113 // 0xdeadbeef contains 24 ones114 %0 = cir.const #cir.int<0xdeadbeef> : !u32i115 %1 = cir.popcount %0 : !u32i116 cir.return %1 : !u32i117 }118 // CHECK-LABEL: @fold_popcount119 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<24> : !u32i120 // CHECK-NEXT: cir.return %[[R]] : !u32i121 // CHECK-NEXT: }122 123 cir.func @fold_bitreverse() -> !u32i {124 // 0xdeadbeef is 0b1101_1110_1010_1101_1011_1110_1110_1111125 %0 = cir.const #cir.int<0xdeadbeef> : !u32i126 %1 = cir.bitreverse %0 : !u32i127 cir.return %1 : !u32i128 }129 // CHECK-LABEL: @fold_bitreverse130 // 4152210811 is 0b1111_0111_0111_1101_1011_0101_0111_1011131 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<4152210811> : !u32i132 // CHECK-NEXT: cir.return %[[R]] : !u32i133 // CHECK-NEXT: }134 135 cir.func @fold_byte_swap() -> !u32i {136 %0 = cir.const #cir.int<0xdeadbeef> : !u32i137 %1 = cir.byte_swap %0 : !u32i138 cir.return %1 : !u32i139 }140 // CHECK-LABEL: @fold_byte_swap141 // 4022250974 is 0xefbeadde142 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<4022250974> : !u32i143 // CHECK-NEXT: cir.return %[[R]] : !u32i144 // CHECK-NEXT: }145 146 cir.func @fold_input_poison() -> !s32i {147 %0 = cir.const #cir.poison : !s32i148 %1 = cir.clrsb %0 : !s32i149 cir.return %1 : !s32i150 }151 // CHECK-LABEL: @fold_input_poison152 // CHECK-NEXT: %[[P:.+]] = cir.const #cir.poison : !s32i153 // CHECK-NEXT: cir.return %[[P]] : !s32i154 // CHECK-NEXT: }155 156 cir.func @fold_rotate_input_all_zeros(%arg0 : !u32i) -> !u32i {157 %0 = cir.const #cir.int<0> : !u32i158 %1 = cir.rotate left %0, %arg0 : !u32i159 cir.return %1 : !u32i160 }161 // CHECK-LABEL: @fold_rotate_input_all_zeros162 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<0> : !u32i163 // CHECK-NEXT: cir.return %[[R]] : !u32i164 // CHECK-NEXT: }165 166 cir.func @fold_rotate_input_all_ones(%arg0 : !u32i) -> !u32i {167 // 4294967295 is 0b1111_1111_1111_1111_1111_1111_1111_1111168 %0 = cir.const #cir.int<4294967295> : !u32i169 %1 = cir.rotate left %0, %arg0 : !u32i170 cir.return %1 : !u32i171 }172 // CHECK-LABEL: @fold_rotate_input_all_ones173 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<4294967295> : !u32i174 // CHECK-NEXT: cir.return %[[R]] : !u32i175 // CHECK-NEXT: }176 177 cir.func @fold_rotate_zero_amount(%arg0 : !u32i) -> !u32i {178 %0 = cir.const #cir.int<32> : !u32i179 %1 = cir.rotate left %arg0, %0 : !u32i180 cir.return %1 : !u32i181 }182 // CHECK-LABEL: @fold_rotate_zero_amount183 // CHECK-SAME: (%[[R:.+]]: !u32i)184 // CHECK-NEXT: cir.return %[[R]] : !u32i185 // CHECK-NEXT: }186 187 cir.func @fold_rotate_left() -> !u32i {188 // 0xdeadbeef is 0b1101_1110_1010_1101_1011_1110_1110_1111189 %0 = cir.const #cir.int<0xdeadbeef> : !u32i190 %1 = cir.const #cir.int<8> : !u32i191 %2 = cir.rotate left %0, %1 : !u32i192 cir.return %2 : !u32i193 }194 // CHECK-LABEL: @fold_rotate_left195 // 2914971614 is 0b1010_1101_1011_1110_1110_1111_1101_1110196 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<2914971614> : !u32i197 // CHECK-NEXT: cir.return %[[R]] : !u32i198 // CHECK-NEXT: }199 200 cir.func @fold_rotate_right() -> !u32i {201 // 0xdeadbeef is 0b1101_1110_1010_1101_1011_1110_1110_1111202 %0 = cir.const #cir.int<0xdeadbeef> : !u32i203 %1 = cir.const #cir.int<8> : !u32i204 %2 = cir.rotate right %0, %1 : !u32i205 cir.return %2 : !u32i206 }207 // CHECK-LABEL: @fold_rotate_right208 // 4260027374 is 0b1110_1111_1101_1110_1010_1101_1011_1110209 // CHECK-NEXT: %[[R:.+]] = cir.const #cir.int<4024348094> : !u32i210 // CHECK-NEXT: cir.return %[[R]] : !u32i211 // CHECK-NEXT: }212 213 cir.func @fold_rotate_input_poison(%arg0 : !u32i) -> !u32i {214 %0 = cir.const #cir.poison : !u32i215 %1 = cir.rotate left %0, %arg0 : !u32i216 cir.return %1 : !u32i217 }218 // CHECK-LABEL: @fold_rotate_input_poison219 // CHECK-NEXT: %[[P:.+]] = cir.const #cir.poison : !u32i220 // CHECK-NEXT: cir.return %[[P]] : !u32i221 // CHECK-NEXT: }222 223 cir.func @fold_rotate_amount_poison(%arg0 : !u32i) -> !u32i {224 %0 = cir.const #cir.poison : !u32i225 %1 = cir.rotate left %arg0, %0 : !u32i226 cir.return %1 : !u32i227 }228 // CHECK-LABEL: @fold_rotate_amount_poison229 // CHECK-NEXT: %[[P:.+]] = cir.const #cir.poison : !u32i230 // CHECK-NEXT: cir.return %[[P]] : !u32i231 // CHECK-NEXT: }232}233