@@ -1359,3 +1359,49 @@ void complex_type_argument() {
1359
1359
// OGCG: store float %[[A_IMAG]], ptr %[[ARG_IMAG_PTR]], align 4
1360
1360
// OGCG: %[[TMP_ARG:.*]] = load <2 x float>, ptr %[[ARG_ADDR]], align 4
1361
1361
// OGCG: call void @_Z22complex_type_parameterCf(<2 x float> noundef %[[TMP_ARG]])
1362
+
1363
+ void real_on_scalar_bool () {
1364
+ bool a;
1365
+ bool b = __real__ a;
1366
+ }
1367
+
1368
+ // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a"]
1369
+ // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
1370
+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.bool>, !cir.bool
1371
+ // CIR: %[[A_REAL:.*]] = cir.complex.real %[[TMP_A]] : !cir.bool -> !cir.bool
1372
+ // CIR: cir.store{{.*}} %[[A_REAL]], %[[B_ADDR]] : !cir.bool, !cir.ptr<!cir.bool>
1373
+
1374
+ // LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1
1375
+ // LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1
1376
+ // LLVM: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1377
+ // LLVM: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1378
+ // LLVM: %[[TMP_A_I8:.*]] = zext i1 %[[TMP_A_I1]] to i8
1379
+ // LLVM: store i8 %[[TMP_A_I8]], ptr %[[B_ADDR]], align 1
1380
+
1381
+ // OGCG: %[[A_ADDR:.*]] = alloca i8, align 1
1382
+ // OGCG: %[[B_ADDR:.*]] = alloca i8, align 1
1383
+ // OGCG: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1384
+ // OGCG: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1385
+ // OGCG: %[[TMP_A_I8:.*]] = zext i1 %[[TMP_A_I1]] to i8
1386
+ // OGCG: store i8 %[[TMP_A_I8]], ptr %[[B_ADDR]], align 1
1387
+
1388
+ void imag_on_scalar_bool () {
1389
+ bool a;
1390
+ bool b = __imag__ a;
1391
+ }
1392
+
1393
+ // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a"]
1394
+ // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
1395
+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.bool>, !cir.bool
1396
+ // CIR: %[[A_IMAG:.*]] = cir.complex.imag %[[TMP_A]] : !cir.bool -> !cir.bool
1397
+ // CIR: cir.store{{.*}} %[[A_IMAG]], %[[B_ADDR]] : !cir.bool, !cir.ptr<!cir.bool>
1398
+
1399
+ // LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1
1400
+ // LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1
1401
+ // LLVM: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1402
+ // LLVM: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1403
+ // LLVM: store i8 0, ptr %[[B_ADDR]], align 1
1404
+
1405
+ // OGCG: %[[A_ADDR:.*]] = alloca i8, align 1
1406
+ // OGCG: %[[B_ADDR:.*]] = alloca i8, align 1
1407
+ // OGCG: store i8 0, ptr %[[B_ADDR]], align 1
0 commit comments