brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · 11f47aa Raw
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