
This patch adds the `#cir.poison` attribute which represents a poison value. This patch also updates various operation folders to let them propagate poison values from their inputs to their outputs.
94 lines
3.2 KiB
Plaintext
94 lines
3.2 KiB
Plaintext
// RUN: cir-opt %s -cir-canonicalize -o - | FileCheck %s
|
|
|
|
!s32i = !cir.int<s, 32>
|
|
!s64i = !cir.int<s, 64>
|
|
!u32i = !cir.int<u, 32>
|
|
|
|
module {
|
|
cir.func @redundant_br() {
|
|
cir.br ^bb1
|
|
^bb1: // pred: ^bb0
|
|
%0 = cir.alloca !u32i, !cir.ptr<!u32i>, ["a", init] {alignment = 4 : i64}
|
|
%1 = cir.const #cir.int<4> : !u32i
|
|
cir.store %1, %0 : !u32i, !cir.ptr<!u32i>
|
|
cir.br ^bb2
|
|
^bb2: // pred: ^bb1
|
|
cir.return
|
|
}
|
|
// CHECK: cir.func{{.*}} @redundant_br() {
|
|
// CHECK-NEXT: %[[A:.*]] = cir.alloca !u32i, !cir.ptr<!u32i>, ["a", init] {alignment = 4 : i64}
|
|
// CHECK-NEXT: %[[FOUR:.*]] = cir.const #cir.int<4> : !u32i
|
|
// CHECK-NEXT: cir.store %[[FOUR]], %[[A]] : !u32i, !cir.ptr<!u32i>
|
|
// CHECK-NEXT: cir.return
|
|
// CHECK-NEXT: }
|
|
|
|
cir.func @empty_scope() {
|
|
cir.scope {
|
|
}
|
|
cir.return
|
|
}
|
|
// CHECK: cir.func{{.*}} @empty_scope() {
|
|
// CHECK-NEXT: cir.return
|
|
// CHECK-NEXT: }
|
|
|
|
cir.func @unary_not(%arg0: !cir.bool) -> !cir.bool {
|
|
%0 = cir.unary(not, %arg0) : !cir.bool, !cir.bool
|
|
%1 = cir.unary(not, %0) : !cir.bool, !cir.bool
|
|
cir.return %1 : !cir.bool
|
|
}
|
|
// CHECK: cir.func{{.*}} @unary_not(%arg0: !cir.bool) -> !cir.bool
|
|
// CHECK-NEXT: cir.return %arg0 : !cir.bool
|
|
|
|
cir.func @unary_poison() -> !s32i {
|
|
%0 = cir.const #cir.poison : !s32i
|
|
%1 = cir.unary(inc, %0) : !s32i, !s32i
|
|
cir.return %1 : !s32i
|
|
}
|
|
// CHECK: @unary_poison
|
|
// CHECK-NEXT: %[[P:.+]] = cir.const #cir.poison : !s32i
|
|
// CHECK-NEXT: cir.return %[[P]] : !s32i
|
|
// CHECK-NEXT: }
|
|
|
|
cir.func @cast1(%arg0: !cir.bool) -> !cir.bool {
|
|
%0 = cir.cast(bool_to_int, %arg0 : !cir.bool), !s32i
|
|
%1 = cir.cast(int_to_bool, %0 : !s32i), !cir.bool
|
|
cir.return %1 : !cir.bool
|
|
}
|
|
// CHECK: cir.func{{.*}} @cast1(%[[ARG0:.*]]: !cir.bool) -> !cir.bool
|
|
// CHECK-NEXT: cir.return %[[ARG0]] : !cir.bool
|
|
|
|
cir.func @cast2(%arg0: !s32i) -> !cir.bool {
|
|
%0 = cir.cast(int_to_bool, %arg0 : !s32i), !cir.bool
|
|
%1 = cir.cast(bool_to_int, %0 : !cir.bool), !s32i
|
|
%2 = cir.cast(integral, %1 : !s32i), !s64i
|
|
%3 = cir.cast(int_to_bool, %2 : !s64i), !cir.bool
|
|
cir.return %3 : !cir.bool
|
|
}
|
|
// CHECK: cir.func{{.*}} @cast2(%[[ARG0:.*]]: !s32i) -> !cir.bool
|
|
// CHECK-NEXT: %[[CAST:.*]] = cir.cast(int_to_bool, %[[ARG0]] : !s32i), !cir.bool
|
|
// CHECK-NEXT: cir.return %[[CAST]] : !cir.bool
|
|
|
|
cir.func @no_fold_cast(%arg0: !s32i) -> !s64i {
|
|
%0 = cir.cast(int_to_bool, %arg0 : !s32i), !cir.bool
|
|
%1 = cir.cast(bool_to_int, %0 : !cir.bool), !s32i
|
|
%2 = cir.cast(integral, %1 : !s32i), !s64i
|
|
cir.return %2 : !s64i
|
|
}
|
|
// CHECK: cir.func{{.*}} @no_fold_cast(%[[ARG0:.*]]: !s32i) -> !s64i
|
|
// CHECK-NEXT: %[[CAST:.*]] = cir.cast(int_to_bool, %[[ARG0]] : !s32i), !cir.bool
|
|
// CHECK-NEXT: %[[CAST2:.*]] = cir.cast(bool_to_int, %[[CAST]] : !cir.bool), !s32i
|
|
// CHECK-NEXT: %[[CAST3:.*]] = cir.cast(integral, %[[CAST2]] : !s32i), !s64i
|
|
// CHECK-NEXT: cir.return %[[CAST3]] : !s64i
|
|
|
|
cir.func @cast_poison() -> !s64i {
|
|
%0 = cir.const #cir.poison : !s32i
|
|
%1 = cir.cast(integral, %0 : !s32i), !s64i
|
|
cir.return %1 : !s64i
|
|
}
|
|
// CHECK: @cast_poison
|
|
// CHECK-NEXT: %[[P:.+]] = cir.const #cir.poison : !s64i
|
|
// CHECK-NEXT: cir.return %[[P]] : !s64i
|
|
// CHECK-NEXT: }
|
|
|
|
}
|