================ @@ -540,3 +540,171 @@ void long_shift_example(long long a, short b) { // OGCG: store i64 %[[SHL]], ptr %[[X]] // OGCG: ret void + +void b1(bool a, bool b) { + bool x = a && b; + x = x || b; +} + +// CIR-LABEL: cir.func @_Z2b1bb( +// CIR-SAME: %[[ARG0:.*]]: !cir.bool {{.*}}, %[[ARG1:.*]]: !cir.bool {{.*}}) +// CIR: [[A:%[0-9]+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a", init] +// CIR: [[B:%[0-9]+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init] +// CIR: [[X:%[0-9]+]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["x", init] +// CIR: cir.store %[[ARG0]], [[A]] : !cir.bool, !cir.ptr<!cir.bool> +// CIR: cir.store %[[ARG1]], [[B]] : !cir.bool, !cir.ptr<!cir.bool> +// CIR: [[AVAL:%[0-9]+]] = cir.load align(1) [[A]] : !cir.ptr<!cir.bool>, !cir.bool +// CIR: [[RES1:%[0-9]+]] = cir.ternary([[AVAL]], true { +// CIR: [[BVAL:%[0-9]+]] = cir.load align(1) [[B]] : !cir.ptr<!cir.bool>, !cir.bool +// CIR: cir.yield [[BVAL]] : !cir.bool +// CIR: }, false { +// CIR: [[FALSE:%[0-9]+]] = cir.const #false +// CIR: cir.yield [[FALSE]] : !cir.bool +// CIR: }) : (!cir.bool) -> !cir.bool +// CIR: cir.store align(1) [[RES1]], [[X]] : !cir.bool, !cir.ptr<!cir.bool> +// CIR: [[XVAL:%[0-9]+]] = cir.load align(1) [[X]] : !cir.ptr<!cir.bool>, !cir.bool +// CIR: [[RES2:%[0-9]+]] = cir.ternary([[XVAL]], true { +// CIR: [[TRUE:%[0-9]+]] = cir.const #true +// CIR: cir.yield [[TRUE]] : !cir.bool +// CIR: }, false { +// CIR: [[BVAL2:%[0-9]+]] = cir.load align(1) [[B]] : !cir.ptr<!cir.bool>, !cir.bool +// CIR: cir.yield [[BVAL2]] : !cir.bool +// CIR: }) : (!cir.bool) -> !cir.bool +// CIR: cir.store align(1) [[RES2]], [[X]] : !cir.bool, !cir.ptr<!cir.bool> +// CIR: cir.return + + +// LLVM-LABEL: define void @_Z2b1bb( +// LLVM-SAME: i1 %[[ARG0:[0-9]+]], i1 %[[ARG1:[0-9]+]]) +// LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1 +// LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1 +// LLVM: %[[X:.*]] = alloca i8, i64 1 +// LLVM: %[[ZEXT0:.*]] = zext i1 %[[ARG0]] to i8 +// LLVM: store i8 %[[ZEXT0]], ptr %[[A_ADDR]] +// LLVM: %[[ZEXT1:.*]] = zext i1 %[[ARG1]] to i8 +// LLVM: store i8 %[[ZEXT1]], ptr %[[B_ADDR]] +// LLVM: %[[A_VAL:.*]] = load i8, ptr %[[A_ADDR]] +// LLVM: %[[A_BOOL:.*]] = trunc i8 %[[A_VAL]] to i1 +// LLVM: br i1 %[[A_BOOL]], label %[[AND_TRUE:[0-9]+]], label %[[AND_FALSE:[0-9]+]] +// LLVM: [[AND_TRUE]]: +// LLVM: %[[B_VAL:.*]] = load i8, ptr %[[B_ADDR]] +// LLVM: %[[B_BOOL:.*]] = trunc i8 %[[B_VAL]] to i1 +// LLVM: br label %[[AND_MERGE:[0-9]+]] +// LLVM: [[AND_FALSE]]: +// LLVM: br label %[[AND_MERGE]] +// LLVM: [[AND_MERGE]]: +// LLVM: %[[AND_PHI:.*]] = phi i1 [ false, %[[AND_FALSE]] ], [ %[[B_BOOL]], %[[AND_TRUE]] ] +// LLVM: br label %[[AND_CONT:[0-9]+]] +// LLVM: [[AND_CONT]]: +// LLVM: %[[ZEXT_AND:.*]] = zext i1 %[[AND_PHI]] to i8 +// LLVM: store i8 %[[ZEXT_AND]], ptr %[[X]] +// LLVM: %[[X_VAL:.*]] = load i8, ptr %[[X]] +// LLVM: %[[X_BOOL:.*]] = trunc i8 %[[X_VAL]] to i1 +// LLVM: br i1 %[[X_BOOL]], label %[[OR_TRUE:[0-9]+]], label %[[OR_FALSE:[0-9]+]] +// LLVM: [[OR_TRUE]]: +// LLVM: br label %[[OR_MERGE:[0-9]+]] +// LLVM: [[OR_FALSE]]: +// LLVM: %[[B_VAL2:.*]] = load i8, ptr %[[B_ADDR]] +// LLVM: %[[B_BOOL2:.*]] = trunc i8 %[[B_VAL2]] to i1 +// LLVM: br label %[[OR_MERGE]] +// LLVM: [[OR_MERGE]]: +// LLVM: %[[OR_PHI:.*]] = phi i1 [ %[[B_BOOL2]], %[[OR_FALSE]] ], [ true, %[[OR_TRUE]] ] +// LLVM: br label %[[OR_CONT:[0-9]+]] +// LLVM: [[OR_CONT]]: +// LLVM: %[[ZEXT_OR:.*]] = zext i1 %[[OR_PHI]] to i8 +// LLVM: store i8 %[[ZEXT_OR]], ptr %[[X]] +// LLVM: ret void ---------------- andykaylor wrote:
Can you add OGCG checks for comparison? https://github.com/llvm/llvm-project/pull/138156 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits