@@ -556,3 +556,69 @@ void test_logical_not() {
556556// OGCG: %[[D_NOT:.*]] = xor i1 %[[D_BOOL]], true
557557// OGCG: %[[D_CAST:.*]] = zext i1 %[[D_NOT]] to i8
558558// OGCG: store i8 %[[D_CAST]], ptr %[[B_ADDR]], align 1
559+
560+ void f16NestedUPlus () {
561+ _Float16 a;
562+ _Float16 b = +(+a);
563+ }
564+
565+ // CHECK: cir.func{{.*}} @_Z14f16NestedUPlusv()
566+ // CHECK: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
567+ // CHECK: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
568+ // CHECK: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.f16>, !cir.f16
569+ // CHECK: %[[A_F32:.*]] = cir.cast(floating, %[[TMP_A]] : !cir.f16), !cir.float
570+ // CHECK: %[[A_PLUS:.*]] = cir.unary(plus, %[[A_F32]]) : !cir.float, !cir.float
571+ // CHECK: %[[RESULT_F32:.*]] = cir.unary(plus, %[[A_PLUS]]) : !cir.float, !cir.float
572+ // CHECK: %[[RESULT:.*]] = cir.cast(floating, %[[RESULT_F32]] : !cir.float), !cir.f16
573+ // CHECK: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
574+
575+ // LLVM: define{{.*}} void @_Z14f16NestedUPlusv()
576+ // LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
577+ // LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
578+ // LLVM: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
579+ // LLVM: %[[RESULT_F32:.*]] = fpext half %[[TMP_A]] to float
580+ // LLVM: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
581+ // LLVM: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
582+
583+ // OGCG: define{{.*}} void @_Z14f16NestedUPlusv()
584+ // OGCG: %[[A_ADDR:.*]] = alloca half, align 2
585+ // OGCG: %[[B_ADDR:.*]] = alloca half, align 2
586+ // OGCG: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
587+ // OGCG: %[[RESULT_F32:.*]] = fpext half %[[TMP_A]] to float
588+ // OGCG: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
589+ // OGCG: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
590+
591+ void f16NestedUMinus () {
592+ _Float16 a;
593+ _Float16 b = -(-a);
594+ }
595+
596+ // CHECK: cir.func{{.*}} @_Z15f16NestedUMinusv()
597+ // CHECK: %[[A_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["a"]
598+ // CHECK: %[[B_ADDR:.*]] = cir.alloca !cir.f16, !cir.ptr<!cir.f16>, ["b", init]
599+ // CHECK: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.f16>, !cir.f16
600+ // CHECK: %[[A_F32:.*]] = cir.cast(floating, %[[TMP_A]] : !cir.f16), !cir.float
601+ // CHECK: %[[A_MINUS:.*]] = cir.unary(minus, %[[A_F32]]) : !cir.float, !cir.float
602+ // CHECK: %[[RESULT_F32:.*]] = cir.unary(minus, %[[A_MINUS]]) : !cir.float, !cir.float
603+ // CHECK: %[[RESULT:.*]] = cir.cast(floating, %[[RESULT_F32]] : !cir.float), !cir.f16
604+ // CHECK: cir.store{{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.f16, !cir.ptr<!cir.f16>
605+
606+ // LLVM: define{{.*}} void @_Z15f16NestedUMinusv()
607+ // LLVM: %[[A_ADDR:.*]] = alloca half, i64 1, align 2
608+ // LLVM: %[[B_ADDR:.*]] = alloca half, i64 1, align 2
609+ // LLVM: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
610+ // LLVM: %[[A_F32:.*]] = fpext half %[[TMP_A]] to float
611+ // LLVM: %[[A_MINUS:.*]] = fneg float %[[A_F32]]
612+ // LLVM: %[[RESULT_F32:.*]] = fneg float %[[A_MINUS]]
613+ // LLVM: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
614+ // LLVM: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
615+
616+ // OGCG: define{{.*}} void @_Z15f16NestedUMinusv()
617+ // OGCG: %[[A_ADDR:.*]] = alloca half, align 2
618+ // OGCG: %[[B_ADDR:.*]] = alloca half, align 2
619+ // OGCG: %[[TMP_A:.*]] = load half, ptr %[[A_ADDR]], align 2
620+ // OGCG: %[[A_F32:.*]] = fpext half %[[TMP_A]] to float
621+ // OGCG: %[[A_MINUS:.*]] = fneg float %[[A_F32]]
622+ // OGCG: %[[RESULT_F32:.*]] = fneg float %[[A_MINUS]]
623+ // OGCG: %[[RESULT:.*]] = fptrunc float %[[RESULT_F32]] to half
624+ // OGCG: store half %[[RESULT]], ptr %[[B_ADDR]], align 2
0 commit comments