brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.0 KiB · 91fc9dd Raw
596 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 %s -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s3 4// CHECK-LABEL: define dso_local i32 @main(5// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {6// CHECK-NEXT:  [[ENTRY:.*]]:7// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 48// CHECK-NEXT:    [[A:%.*]] = alloca { double, double }, align 89// CHECK-NEXT:    [[B:%.*]] = alloca { double, double }, align 810// CHECK-NEXT:    store i32 0, ptr [[RETVAL]], align 411// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 012// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 113// CHECK-NEXT:    store double 5.000000e+00, ptr [[A_REALP]], align 814// CHECK-NEXT:    store double 0.000000e+00, ptr [[A_IMAGP]], align 815// CHECK-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 016// CHECK-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 117// CHECK-NEXT:    store double 4.200000e+01, ptr [[B_REALP]], align 818// CHECK-NEXT:    store double 0.000000e+00, ptr [[B_IMAGP]], align 819// CHECK-NEXT:    [[A_REALP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 020// CHECK-NEXT:    [[A_REAL:%.*]] = load double, ptr [[A_REALP1]], align 821// CHECK-NEXT:    [[A_IMAGP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 122// CHECK-NEXT:    [[A_IMAG:%.*]] = load double, ptr [[A_IMAGP2]], align 823// CHECK-NEXT:    [[B_REALP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 024// CHECK-NEXT:    [[B_REAL:%.*]] = load double, ptr [[B_REALP3]], align 825// CHECK-NEXT:    [[B_IMAGP4:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 126// CHECK-NEXT:    [[B_IMAG:%.*]] = load double, ptr [[B_IMAGP4]], align 827// CHECK-NEXT:    [[MUL_AC:%.*]] = fmul double [[A_REAL]], [[B_REAL]]28// CHECK-NEXT:    [[MUL_BD:%.*]] = fmul double [[A_IMAG]], [[B_IMAG]]29// CHECK-NEXT:    [[MUL_AD:%.*]] = fmul double [[A_REAL]], [[B_IMAG]]30// CHECK-NEXT:    [[MUL_BC:%.*]] = fmul double [[A_IMAG]], [[B_REAL]]31// CHECK-NEXT:    [[MUL_R:%.*]] = fsub double [[MUL_AC]], [[MUL_BD]]32// CHECK-NEXT:    [[MUL_I:%.*]] = fadd double [[MUL_AD]], [[MUL_BC]]33// CHECK-NEXT:    [[ISNAN_CMP:%.*]] = fcmp uno double [[MUL_R]], [[MUL_R]]34// CHECK-NEXT:    br i1 [[ISNAN_CMP]], label %[[COMPLEX_MUL_IMAG_NAN:.*]], label %[[COMPLEX_MUL_CONT:.*]], !prof [[PROF2:![0-9]+]]35// CHECK:       [[COMPLEX_MUL_IMAG_NAN]]:36// CHECK-NEXT:    [[ISNAN_CMP5:%.*]] = fcmp uno double [[MUL_I]], [[MUL_I]]37// CHECK-NEXT:    br i1 [[ISNAN_CMP5]], label %[[COMPLEX_MUL_LIBCALL:.*]], label %[[COMPLEX_MUL_CONT]], !prof [[PROF2]]38// CHECK:       [[COMPLEX_MUL_LIBCALL]]:39// CHECK-NEXT:    [[CALL:%.*]] = call { double, double } @__muldc3(double noundef [[A_REAL]], double noundef [[A_IMAG]], double noundef [[B_REAL]], double noundef [[B_IMAG]]) #[[ATTR4:[0-9]+]]40// CHECK-NEXT:    [[TMP0:%.*]] = extractvalue { double, double } [[CALL]], 041// CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { double, double } [[CALL]], 142// CHECK-NEXT:    br label %[[COMPLEX_MUL_CONT]]43// CHECK:       [[COMPLEX_MUL_CONT]]:44// CHECK-NEXT:    [[REAL_MUL_PHI:%.*]] = phi double [ [[MUL_R]], %[[ENTRY]] ], [ [[MUL_R]], %[[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP0]], %[[COMPLEX_MUL_LIBCALL]] ]45// CHECK-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi double [ [[MUL_I]], %[[ENTRY]] ], [ [[MUL_I]], %[[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP1]], %[[COMPLEX_MUL_LIBCALL]] ]46// CHECK-NEXT:    [[B_REALP6:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 047// CHECK-NEXT:    [[B_REAL7:%.*]] = load double, ptr [[B_REALP6]], align 848// CHECK-NEXT:    [[B_IMAGP8:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i32 0, i32 149// CHECK-NEXT:    [[B_IMAG9:%.*]] = load double, ptr [[B_IMAGP8]], align 850// CHECK-NEXT:    [[A_REALP10:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 051// CHECK-NEXT:    [[A_REAL11:%.*]] = load double, ptr [[A_REALP10]], align 852// CHECK-NEXT:    [[A_IMAGP12:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i32 0, i32 153// CHECK-NEXT:    [[A_IMAG13:%.*]] = load double, ptr [[A_IMAGP12]], align 854// CHECK-NEXT:    [[MUL_AC14:%.*]] = fmul double [[B_REAL7]], [[A_REAL11]]55// CHECK-NEXT:    [[MUL_BD15:%.*]] = fmul double [[B_IMAG9]], [[A_IMAG13]]56// CHECK-NEXT:    [[MUL_AD16:%.*]] = fmul double [[B_REAL7]], [[A_IMAG13]]57// CHECK-NEXT:    [[MUL_BC17:%.*]] = fmul double [[B_IMAG9]], [[A_REAL11]]58// CHECK-NEXT:    [[MUL_R18:%.*]] = fsub double [[MUL_AC14]], [[MUL_BD15]]59// CHECK-NEXT:    [[MUL_I19:%.*]] = fadd double [[MUL_AD16]], [[MUL_BC17]]60// CHECK-NEXT:    [[ISNAN_CMP20:%.*]] = fcmp uno double [[MUL_R18]], [[MUL_R18]]61// CHECK-NEXT:    br i1 [[ISNAN_CMP20]], label %[[COMPLEX_MUL_IMAG_NAN21:.*]], label %[[COMPLEX_MUL_CONT25:.*]], !prof [[PROF2]]62// CHECK:       [[COMPLEX_MUL_IMAG_NAN21]]:63// CHECK-NEXT:    [[ISNAN_CMP22:%.*]] = fcmp uno double [[MUL_I19]], [[MUL_I19]]64// CHECK-NEXT:    br i1 [[ISNAN_CMP22]], label %[[COMPLEX_MUL_LIBCALL23:.*]], label %[[COMPLEX_MUL_CONT25]], !prof [[PROF2]]65// CHECK:       [[COMPLEX_MUL_LIBCALL23]]:66// CHECK-NEXT:    [[CALL24:%.*]] = call { double, double } @__muldc3(double noundef [[B_REAL7]], double noundef [[B_IMAG9]], double noundef [[A_REAL11]], double noundef [[A_IMAG13]]) #[[ATTR4]]67// CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { double, double } [[CALL24]], 068// CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { double, double } [[CALL24]], 169// CHECK-NEXT:    br label %[[COMPLEX_MUL_CONT25]]70// CHECK:       [[COMPLEX_MUL_CONT25]]:71// CHECK-NEXT:    [[REAL_MUL_PHI26:%.*]] = phi double [ [[MUL_R18]], %[[COMPLEX_MUL_CONT]] ], [ [[MUL_R18]], %[[COMPLEX_MUL_IMAG_NAN21]] ], [ [[TMP2]], %[[COMPLEX_MUL_LIBCALL23]] ]72// CHECK-NEXT:    [[IMAG_MUL_PHI27:%.*]] = phi double [ [[MUL_I19]], %[[COMPLEX_MUL_CONT]] ], [ [[MUL_I19]], %[[COMPLEX_MUL_IMAG_NAN21]] ], [ [[TMP3]], %[[COMPLEX_MUL_LIBCALL23]] ]73// CHECK-NEXT:    [[CMP_R:%.*]] = fcmp une double [[REAL_MUL_PHI]], [[REAL_MUL_PHI26]]74// CHECK-NEXT:    [[CMP_I:%.*]] = fcmp une double [[IMAG_MUL_PHI]], [[IMAG_MUL_PHI27]]75// CHECK-NEXT:    [[OR_RI:%.*]] = or i1 [[CMP_R]], [[CMP_I]]76// CHECK-NEXT:    [[CONV:%.*]] = zext i1 [[OR_RI]] to i3277// CHECK-NEXT:    ret i32 [[CONV]]78//79int main(void)80{81  double _Complex a = 5;82  double _Complex b = 42;83 84  return a * b != b * a;85}86 87_Complex double bar(int);88void test(_Complex double*);89void takecomplex(_Complex double);90 91// CHECK-LABEL: define dso_local void @test2(92// CHECK-SAME: i32 noundef [[C:%.*]]) #[[ATTR0]] {93// CHECK-NEXT:  [[ENTRY:.*:]]94// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca i32, align 495// CHECK-NEXT:    [[X:%.*]] = alloca { double, double }, align 896// CHECK-NEXT:    [[COERCE:%.*]] = alloca { double, double }, align 897// CHECK-NEXT:    store i32 [[C]], ptr [[C_ADDR]], align 498// CHECK-NEXT:    [[CALL:%.*]] = call { double, double } @bar(i32 noundef 1)99// CHECK-NEXT:    [[TMP0:%.*]] = extractvalue { double, double } [[CALL]], 0100// CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { double, double } [[CALL]], 1101// CHECK-NEXT:    [[X_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[X]], i32 0, i32 0102// CHECK-NEXT:    [[X_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[X]], i32 0, i32 1103// CHECK-NEXT:    store double [[TMP0]], ptr [[X_REALP]], align 8104// CHECK-NEXT:    store double [[TMP1]], ptr [[X_IMAGP]], align 8105// CHECK-NEXT:    call void @test(ptr noundef [[X]])106// CHECK-NEXT:    [[X_REALP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[X]], i32 0, i32 0107// CHECK-NEXT:    [[X_REAL:%.*]] = load double, ptr [[X_REALP1]], align 8108// CHECK-NEXT:    [[X_IMAGP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[X]], i32 0, i32 1109// CHECK-NEXT:    [[X_IMAG:%.*]] = load double, ptr [[X_IMAGP2]], align 8110// CHECK-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE]], i32 0, i32 0111// CHECK-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE]], i32 0, i32 1112// CHECK-NEXT:    store double [[X_REAL]], ptr [[COERCE_REALP]], align 8113// CHECK-NEXT:    store double [[X_IMAG]], ptr [[COERCE_IMAGP]], align 8114// CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE]], i32 0, i32 0115// CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr [[TMP2]], align 8116// CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[COERCE]], i32 0, i32 1117// CHECK-NEXT:    [[TMP5:%.*]] = load double, ptr [[TMP4]], align 8118// CHECK-NEXT:    call void @takecomplex(double noundef [[TMP3]], double noundef [[TMP5]])119// CHECK-NEXT:    ret void120//121void test2(int c) {122  _Complex double X;123  X = bar(1);124  test(&X);125  takecomplex(X);126}127 128_Complex double g1, g2;129_Complex float cf;130double D;131 132// CHECK-LABEL: define dso_local void @test3(133// CHECK-SAME: ) #[[ATTR0]] {134// CHECK-NEXT:  [[ENTRY:.*]]:135// CHECK-NEXT:    [[GR:%.*]] = alloca double, align 8136// CHECK-NEXT:    [[G1_REAL:%.*]] = load double, ptr @g1, align 8137// CHECK-NEXT:    [[G1_IMAG:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8138// CHECK-NEXT:    [[G2_REAL:%.*]] = load double, ptr @g2, align 8139// CHECK-NEXT:    [[G2_IMAG:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g2, i32 0, i32 1), align 8140// CHECK-NEXT:    [[ADD_R:%.*]] = fadd double [[G1_REAL]], [[G2_REAL]]141// CHECK-NEXT:    [[ADD_I:%.*]] = fadd double [[G1_IMAG]], [[G2_IMAG]]142// CHECK-NEXT:    store double [[ADD_R]], ptr @g1, align 8143// CHECK-NEXT:    store double [[ADD_I]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8144// CHECK-NEXT:    [[G1_REAL1:%.*]] = load double, ptr @g1, align 8145// CHECK-NEXT:    [[G1_IMAG2:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8146// CHECK-NEXT:    [[G2_REAL3:%.*]] = load double, ptr @g2, align 8147// CHECK-NEXT:    [[G2_IMAG4:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g2, i32 0, i32 1), align 8148// CHECK-NEXT:    [[SUB_R:%.*]] = fsub double [[G1_REAL1]], [[G2_REAL3]]149// CHECK-NEXT:    [[SUB_I:%.*]] = fsub double [[G1_IMAG2]], [[G2_IMAG4]]150// CHECK-NEXT:    store double [[SUB_R]], ptr @g1, align 8151// CHECK-NEXT:    store double [[SUB_I]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8152// CHECK-NEXT:    [[G1_REAL5:%.*]] = load double, ptr @g1, align 8153// CHECK-NEXT:    [[G1_IMAG6:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8154// CHECK-NEXT:    [[G2_REAL7:%.*]] = load double, ptr @g2, align 8155// CHECK-NEXT:    [[G2_IMAG8:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g2, i32 0, i32 1), align 8156// CHECK-NEXT:    [[MUL_AC:%.*]] = fmul double [[G1_REAL5]], [[G2_REAL7]]157// CHECK-NEXT:    [[MUL_BD:%.*]] = fmul double [[G1_IMAG6]], [[G2_IMAG8]]158// CHECK-NEXT:    [[MUL_AD:%.*]] = fmul double [[G1_REAL5]], [[G2_IMAG8]]159// CHECK-NEXT:    [[MUL_BC:%.*]] = fmul double [[G1_IMAG6]], [[G2_REAL7]]160// CHECK-NEXT:    [[MUL_R:%.*]] = fsub double [[MUL_AC]], [[MUL_BD]]161// CHECK-NEXT:    [[MUL_I:%.*]] = fadd double [[MUL_AD]], [[MUL_BC]]162// CHECK-NEXT:    [[ISNAN_CMP:%.*]] = fcmp uno double [[MUL_R]], [[MUL_R]]163// CHECK-NEXT:    br i1 [[ISNAN_CMP]], label %[[COMPLEX_MUL_IMAG_NAN:.*]], label %[[COMPLEX_MUL_CONT:.*]], !prof [[PROF2]]164// CHECK:       [[COMPLEX_MUL_IMAG_NAN]]:165// CHECK-NEXT:    [[ISNAN_CMP9:%.*]] = fcmp uno double [[MUL_I]], [[MUL_I]]166// CHECK-NEXT:    br i1 [[ISNAN_CMP9]], label %[[COMPLEX_MUL_LIBCALL:.*]], label %[[COMPLEX_MUL_CONT]], !prof [[PROF2]]167// CHECK:       [[COMPLEX_MUL_LIBCALL]]:168// CHECK-NEXT:    [[CALL:%.*]] = call { double, double } @__muldc3(double noundef [[G1_REAL5]], double noundef [[G1_IMAG6]], double noundef [[G2_REAL7]], double noundef [[G2_IMAG8]]) #[[ATTR4]]169// CHECK-NEXT:    [[TMP0:%.*]] = extractvalue { double, double } [[CALL]], 0170// CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { double, double } [[CALL]], 1171// CHECK-NEXT:    br label %[[COMPLEX_MUL_CONT]]172// CHECK:       [[COMPLEX_MUL_CONT]]:173// CHECK-NEXT:    [[REAL_MUL_PHI:%.*]] = phi double [ [[MUL_R]], %[[ENTRY]] ], [ [[MUL_R]], %[[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP0]], %[[COMPLEX_MUL_LIBCALL]] ]174// CHECK-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi double [ [[MUL_I]], %[[ENTRY]] ], [ [[MUL_I]], %[[COMPLEX_MUL_IMAG_NAN]] ], [ [[TMP1]], %[[COMPLEX_MUL_LIBCALL]] ]175// CHECK-NEXT:    store double [[REAL_MUL_PHI]], ptr @g1, align 8176// CHECK-NEXT:    store double [[IMAG_MUL_PHI]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8177// CHECK-NEXT:    [[G1_REAL10:%.*]] = load double, ptr @g1, align 8178// CHECK-NEXT:    [[G1_IMAG11:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8179// CHECK-NEXT:    [[CONJ_I:%.*]] = fneg double [[G1_IMAG11]]180// CHECK-NEXT:    [[NEG_R:%.*]] = fneg double [[G1_REAL10]]181// CHECK-NEXT:    [[NEG_I:%.*]] = fneg double [[CONJ_I]]182// CHECK-NEXT:    store double [[NEG_R]], ptr @g1, align 8183// CHECK-NEXT:    store double [[NEG_I]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8184// CHECK-NEXT:    [[TMP2:%.*]] = load double, ptr @g1, align 8185// CHECK-NEXT:    store double [[TMP2]], ptr [[GR]], align 8186// CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr @D, align 8187// CHECK-NEXT:    [[CF_REAL:%.*]] = load float, ptr @cf, align 4188// CHECK-NEXT:    [[CF_IMAG:%.*]] = load float, ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4189// CHECK-NEXT:    [[CONV:%.*]] = fpext float [[CF_REAL]] to double190// CHECK-NEXT:    [[CONV12:%.*]] = fpext float [[CF_IMAG]] to double191// CHECK-NEXT:    [[ADD_R13:%.*]] = fadd double [[CONV]], [[TMP3]]192// CHECK-NEXT:    [[CONV14:%.*]] = fptrunc double [[ADD_R13]] to float193// CHECK-NEXT:    [[CONV15:%.*]] = fptrunc double [[CONV12]] to float194// CHECK-NEXT:    store float [[CONV14]], ptr @cf, align 4195// CHECK-NEXT:    store float [[CONV15]], ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4196// CHECK-NEXT:    [[CF_REAL16:%.*]] = load float, ptr @cf, align 4197// CHECK-NEXT:    [[CF_IMAG17:%.*]] = load float, ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4198// CHECK-NEXT:    [[CONV18:%.*]] = fpext float [[CF_REAL16]] to double199// CHECK-NEXT:    [[CONV19:%.*]] = fpext float [[CF_IMAG17]] to double200// CHECK-NEXT:    [[TMP4:%.*]] = load double, ptr @D, align 8201// CHECK-NEXT:    [[ADD_R20:%.*]] = fadd double [[TMP4]], [[CONV18]]202// CHECK-NEXT:    store double [[ADD_R20]], ptr @D, align 8203// CHECK-NEXT:    [[G1_REAL21:%.*]] = load double, ptr @g1, align 8204// CHECK-NEXT:    [[G1_IMAG22:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8205// CHECK-NEXT:    [[CF_REAL23:%.*]] = load float, ptr @cf, align 4206// CHECK-NEXT:    [[CF_IMAG24:%.*]] = load float, ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4207// CHECK-NEXT:    [[CONV25:%.*]] = fpext float [[CF_REAL23]] to double208// CHECK-NEXT:    [[CONV26:%.*]] = fpext float [[CF_IMAG24]] to double209// CHECK-NEXT:    [[CALL27:%.*]] = call { double, double } @__divdc3(double noundef [[CONV25]], double noundef [[CONV26]], double noundef [[G1_REAL21]], double noundef [[G1_IMAG22]]) #[[ATTR4]]210// CHECK-NEXT:    [[TMP5:%.*]] = extractvalue { double, double } [[CALL27]], 0211// CHECK-NEXT:    [[TMP6:%.*]] = extractvalue { double, double } [[CALL27]], 1212// CHECK-NEXT:    [[CONV28:%.*]] = fptrunc double [[TMP5]] to float213// CHECK-NEXT:    [[CONV29:%.*]] = fptrunc double [[TMP6]] to float214// CHECK-NEXT:    store float [[CONV28]], ptr @cf, align 4215// CHECK-NEXT:    store float [[CONV29]], ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4216// CHECK-NEXT:    [[G1_REAL30:%.*]] = load double, ptr @g1, align 8217// CHECK-NEXT:    [[G1_IMAG31:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8218// CHECK-NEXT:    [[TMP7:%.*]] = load double, ptr @D, align 8219// CHECK-NEXT:    [[ADD_R32:%.*]] = fadd double [[G1_REAL30]], [[TMP7]]220// CHECK-NEXT:    store double [[ADD_R32]], ptr @g1, align 8221// CHECK-NEXT:    store double [[G1_IMAG31]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8222// CHECK-NEXT:    [[TMP8:%.*]] = load double, ptr @D, align 8223// CHECK-NEXT:    [[G1_REAL33:%.*]] = load double, ptr @g1, align 8224// CHECK-NEXT:    [[G1_IMAG34:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8225// CHECK-NEXT:    [[ADD_R35:%.*]] = fadd double [[TMP8]], [[G1_REAL33]]226// CHECK-NEXT:    store double [[ADD_R35]], ptr @g1, align 8227// CHECK-NEXT:    store double [[G1_IMAG34]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8228// CHECK-NEXT:    ret void229//230void test3(void) {231  g1 = g1 + g2;232  g1 = g1 - g2;233  g1 = g1 * g2;234  g1 = +-~g1;235 236  double Gr = __real g1;237 238  cf += D;239  D += cf;240  cf /= g1;241  g1 = g1 + D;242  g1 = D + g1;243}244 245__complex__ int ci1, ci2;246__complex__ short cs;247int i;248// CHECK-LABEL: define dso_local void @test3int(249// CHECK-SAME: ) #[[ATTR0]] {250// CHECK-NEXT:  [[ENTRY:.*:]]251// CHECK-NEXT:    [[CI1_REAL:%.*]] = load i32, ptr @ci1, align 4252// CHECK-NEXT:    [[CI1_IMAG:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4253// CHECK-NEXT:    [[CI2_REAL:%.*]] = load i32, ptr @ci2, align 4254// CHECK-NEXT:    [[CI2_IMAG:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci2, i32 0, i32 1), align 4255// CHECK-NEXT:    [[ADD_R:%.*]] = add i32 [[CI1_REAL]], [[CI2_REAL]]256// CHECK-NEXT:    [[ADD_I:%.*]] = add i32 [[CI1_IMAG]], [[CI2_IMAG]]257// CHECK-NEXT:    store i32 [[ADD_R]], ptr @ci1, align 4258// CHECK-NEXT:    store i32 [[ADD_I]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4259// CHECK-NEXT:    [[CI1_REAL1:%.*]] = load i32, ptr @ci1, align 4260// CHECK-NEXT:    [[CI1_IMAG2:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4261// CHECK-NEXT:    [[CI2_REAL3:%.*]] = load i32, ptr @ci2, align 4262// CHECK-NEXT:    [[CI2_IMAG4:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci2, i32 0, i32 1), align 4263// CHECK-NEXT:    [[SUB_R:%.*]] = sub i32 [[CI1_REAL1]], [[CI2_REAL3]]264// CHECK-NEXT:    [[SUB_I:%.*]] = sub i32 [[CI1_IMAG2]], [[CI2_IMAG4]]265// CHECK-NEXT:    store i32 [[SUB_R]], ptr @ci1, align 4266// CHECK-NEXT:    store i32 [[SUB_I]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4267// CHECK-NEXT:    [[CI1_REAL5:%.*]] = load i32, ptr @ci1, align 4268// CHECK-NEXT:    [[CI1_IMAG6:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4269// CHECK-NEXT:    [[CI2_REAL7:%.*]] = load i32, ptr @ci2, align 4270// CHECK-NEXT:    [[CI2_IMAG8:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci2, i32 0, i32 1), align 4271// CHECK-NEXT:    [[MUL_RL:%.*]] = mul i32 [[CI1_REAL5]], [[CI2_REAL7]]272// CHECK-NEXT:    [[MUL_RR:%.*]] = mul i32 [[CI1_IMAG6]], [[CI2_IMAG8]]273// CHECK-NEXT:    [[MUL_R:%.*]] = sub i32 [[MUL_RL]], [[MUL_RR]]274// CHECK-NEXT:    [[MUL_IL:%.*]] = mul i32 [[CI1_IMAG6]], [[CI2_REAL7]]275// CHECK-NEXT:    [[MUL_IR:%.*]] = mul i32 [[CI1_REAL5]], [[CI2_IMAG8]]276// CHECK-NEXT:    [[MUL_I:%.*]] = add i32 [[MUL_IL]], [[MUL_IR]]277// CHECK-NEXT:    store i32 [[MUL_R]], ptr @ci1, align 4278// CHECK-NEXT:    store i32 [[MUL_I]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4279// CHECK-NEXT:    [[CI1_REAL9:%.*]] = load i32, ptr @ci1, align 4280// CHECK-NEXT:    [[CI1_IMAG10:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4281// CHECK-NEXT:    [[CONJ_I:%.*]] = sub i32 0, [[CI1_IMAG10]]282// CHECK-NEXT:    [[NEG_R:%.*]] = sub i32 0, [[CI1_REAL9]]283// CHECK-NEXT:    [[NEG_I:%.*]] = sub i32 0, [[CONJ_I]]284// CHECK-NEXT:    store i32 [[NEG_R]], ptr @ci1, align 4285// CHECK-NEXT:    store i32 [[NEG_I]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4286// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @ci1, align 4287// CHECK-NEXT:    store i32 [[TMP0]], ptr @i, align 4288// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @i, align 4289// CHECK-NEXT:    [[CS_REAL:%.*]] = load i16, ptr @cs, align 2290// CHECK-NEXT:    [[CS_IMAG:%.*]] = load i16, ptr getelementptr inbounds nuw ({ i16, i16 }, ptr @cs, i32 0, i32 1), align 2291// CHECK-NEXT:    [[CONV:%.*]] = sext i16 [[CS_REAL]] to i32292// CHECK-NEXT:    [[CONV11:%.*]] = sext i16 [[CS_IMAG]] to i32293// CHECK-NEXT:    [[ADD_R12:%.*]] = add i32 [[CONV]], [[TMP1]]294// CHECK-NEXT:    [[ADD_I13:%.*]] = add i32 [[CONV11]], 0295// CHECK-NEXT:    [[CONV14:%.*]] = trunc i32 [[ADD_R12]] to i16296// CHECK-NEXT:    [[CONV15:%.*]] = trunc i32 [[ADD_I13]] to i16297// CHECK-NEXT:    store i16 [[CONV14]], ptr @cs, align 2298// CHECK-NEXT:    store i16 [[CONV15]], ptr getelementptr inbounds nuw ({ i16, i16 }, ptr @cs, i32 0, i32 1), align 2299// CHECK-NEXT:    [[CF_REAL:%.*]] = load float, ptr @cf, align 4300// CHECK-NEXT:    [[CF_IMAG:%.*]] = load float, ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4301// CHECK-NEXT:    [[CONV16:%.*]] = fpext float [[CF_REAL]] to double302// CHECK-NEXT:    [[CONV17:%.*]] = fpext float [[CF_IMAG]] to double303// CHECK-NEXT:    [[TMP2:%.*]] = load double, ptr @D, align 8304// CHECK-NEXT:    [[ADD_R18:%.*]] = fadd double [[TMP2]], [[CONV16]]305// CHECK-NEXT:    store double [[ADD_R18]], ptr @D, align 8306// CHECK-NEXT:    [[CI1_REAL19:%.*]] = load i32, ptr @ci1, align 4307// CHECK-NEXT:    [[CI1_IMAG20:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4308// CHECK-NEXT:    [[CS_REAL21:%.*]] = load i16, ptr @cs, align 2309// CHECK-NEXT:    [[CS_IMAG22:%.*]] = load i16, ptr getelementptr inbounds nuw ({ i16, i16 }, ptr @cs, i32 0, i32 1), align 2310// CHECK-NEXT:    [[CONV23:%.*]] = sext i16 [[CS_REAL21]] to i32311// CHECK-NEXT:    [[CONV24:%.*]] = sext i16 [[CS_IMAG22]] to i32312// CHECK-NEXT:    [[TMP3:%.*]] = mul i32 [[CONV23]], [[CI1_REAL19]]313// CHECK-NEXT:    [[TMP4:%.*]] = mul i32 [[CONV24]], [[CI1_IMAG20]]314// CHECK-NEXT:    [[TMP5:%.*]] = add i32 [[TMP3]], [[TMP4]]315// CHECK-NEXT:    [[TMP6:%.*]] = mul i32 [[CI1_REAL19]], [[CI1_REAL19]]316// CHECK-NEXT:    [[TMP7:%.*]] = mul i32 [[CI1_IMAG20]], [[CI1_IMAG20]]317// CHECK-NEXT:    [[TMP8:%.*]] = add i32 [[TMP6]], [[TMP7]]318// CHECK-NEXT:    [[TMP9:%.*]] = mul i32 [[CONV24]], [[CI1_REAL19]]319// CHECK-NEXT:    [[TMP10:%.*]] = mul i32 [[CONV23]], [[CI1_IMAG20]]320// CHECK-NEXT:    [[TMP11:%.*]] = sub i32 [[TMP9]], [[TMP10]]321// CHECK-NEXT:    [[TMP12:%.*]] = sdiv i32 [[TMP5]], [[TMP8]]322// CHECK-NEXT:    [[TMP13:%.*]] = sdiv i32 [[TMP11]], [[TMP8]]323// CHECK-NEXT:    [[CONV25:%.*]] = trunc i32 [[TMP12]] to i16324// CHECK-NEXT:    [[CONV26:%.*]] = trunc i32 [[TMP13]] to i16325// CHECK-NEXT:    store i16 [[CONV25]], ptr @cs, align 2326// CHECK-NEXT:    store i16 [[CONV26]], ptr getelementptr inbounds nuw ({ i16, i16 }, ptr @cs, i32 0, i32 1), align 2327// CHECK-NEXT:    [[CI1_REAL27:%.*]] = load i32, ptr @ci1, align 4328// CHECK-NEXT:    [[CI1_IMAG28:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4329// CHECK-NEXT:    [[TMP14:%.*]] = load i32, ptr @i, align 4330// CHECK-NEXT:    [[ADD_R29:%.*]] = add i32 [[CI1_REAL27]], [[TMP14]]331// CHECK-NEXT:    [[ADD_I30:%.*]] = add i32 [[CI1_IMAG28]], 0332// CHECK-NEXT:    store i32 [[ADD_R29]], ptr @ci1, align 4333// CHECK-NEXT:    store i32 [[ADD_I30]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4334// CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr @i, align 4335// CHECK-NEXT:    [[CI1_REAL31:%.*]] = load i32, ptr @ci1, align 4336// CHECK-NEXT:    [[CI1_IMAG32:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4337// CHECK-NEXT:    [[ADD_R33:%.*]] = add i32 [[TMP15]], [[CI1_REAL31]]338// CHECK-NEXT:    [[ADD_I34:%.*]] = add i32 0, [[CI1_IMAG32]]339// CHECK-NEXT:    store i32 [[ADD_R33]], ptr @ci1, align 4340// CHECK-NEXT:    store i32 [[ADD_I34]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4341// CHECK-NEXT:    ret void342//343void test3int(void) {344  ci1 = ci1 + ci2;345  ci1 = ci1 - ci2;346  ci1 = ci1 * ci2;347  ci1 = +-~ci1;348 349  i = __real ci1;350 351  cs += i;352  D += cf;353  cs /= ci1;354  ci1 = ci1 + i;355  ci1 = i + ci1;356}357 358// CHECK-LABEL: define dso_local void @t1(359// CHECK-SAME: ) #[[ATTR0]] {360// CHECK-NEXT:  [[ENTRY:.*:]]361// CHECK-NEXT:    store float 4.000000e+00, ptr @cf, align 4362// CHECK-NEXT:    ret void363//364void t1(void) {365  (__real__ cf) = 4.0;366}367 368// CHECK-LABEL: define dso_local void @t2(369// CHECK-SAME: ) #[[ATTR0]] {370// CHECK-NEXT:  [[ENTRY:.*:]]371// CHECK-NEXT:    store float 4.000000e+00, ptr getelementptr inbounds nuw ({ float, float }, ptr @cf, i32 0, i32 1), align 4372// CHECK-NEXT:    ret void373//374void t2(void) {375  (__imag__ cf) = 4.0;376}377 378// PR1960379// CHECK-LABEL: define dso_local void @t3(380// CHECK-SAME: ) #[[ATTR0]] {381// CHECK-NEXT:  [[ENTRY:.*:]]382// CHECK-NEXT:    [[V:%.*]] = alloca { i64, i64 }, align 8383// CHECK-NEXT:    [[V_REALP:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[V]], i32 0, i32 0384// CHECK-NEXT:    [[V_IMAGP:%.*]] = getelementptr inbounds nuw { i64, i64 }, ptr [[V]], i32 0, i32 1385// CHECK-NEXT:    store i64 2, ptr [[V_REALP]], align 8386// CHECK-NEXT:    store i64 0, ptr [[V_IMAGP]], align 8387// CHECK-NEXT:    ret void388//389void t3(void) {390  __complex__ long long v = 2;391}392 393// PR3131394float _Complex t4(void);395 396// CHECK-LABEL: define dso_local void @t5(397// CHECK-SAME: ) #[[ATTR2:[0-9]+]] {398// CHECK-NEXT:  [[ENTRY:.*:]]399// CHECK-NEXT:    [[X:%.*]] = alloca { float, float }, align 4400// CHECK-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 4401// CHECK-NEXT:    [[CALL:%.*]] = call <2 x float> @t4()402// CHECK-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 4403// CHECK-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 0404// CHECK-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 4405// CHECK-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 1406// CHECK-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 4407// CHECK-NEXT:    [[X_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[X]], i32 0, i32 0408// CHECK-NEXT:    [[X_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[X]], i32 0, i32 1409// CHECK-NEXT:    store float [[COERCE_REAL]], ptr [[X_REALP]], align 4410// CHECK-NEXT:    store float [[COERCE_IMAG]], ptr [[X_IMAGP]], align 4411// CHECK-NEXT:    ret void412//413void t5(void) {414  float _Complex x = t4();415}416 417// CHECK-LABEL: define dso_local void @t6(418// CHECK-SAME: ) #[[ATTR0]] {419// CHECK-NEXT:  [[ENTRY:.*:]]420// CHECK-NEXT:    [[G1_REAL:%.*]] = load double, ptr @g1, align 8421// CHECK-NEXT:    [[G1_IMAG:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8422// CHECK-NEXT:    [[INC:%.*]] = fadd double [[G1_REAL]], 1.000000e+00423// CHECK-NEXT:    store double [[INC]], ptr @g1, align 8424// CHECK-NEXT:    store double [[G1_IMAG]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8425// CHECK-NEXT:    [[G1_REAL1:%.*]] = load double, ptr @g1, align 8426// CHECK-NEXT:    [[G1_IMAG2:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8427// CHECK-NEXT:    [[DEC:%.*]] = fadd double [[G1_REAL1]], -1.000000e+00428// CHECK-NEXT:    store double [[DEC]], ptr @g1, align 8429// CHECK-NEXT:    store double [[G1_IMAG2]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8430// CHECK-NEXT:    [[G1_REAL3:%.*]] = load double, ptr @g1, align 8431// CHECK-NEXT:    [[G1_IMAG4:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8432// CHECK-NEXT:    [[INC5:%.*]] = fadd double [[G1_REAL3]], 1.000000e+00433// CHECK-NEXT:    store double [[INC5]], ptr @g1, align 8434// CHECK-NEXT:    store double [[G1_IMAG4]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8435// CHECK-NEXT:    [[G1_REAL6:%.*]] = load double, ptr @g1, align 8436// CHECK-NEXT:    [[G1_IMAG7:%.*]] = load double, ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8437// CHECK-NEXT:    [[DEC8:%.*]] = fadd double [[G1_REAL6]], -1.000000e+00438// CHECK-NEXT:    store double [[DEC8]], ptr @g1, align 8439// CHECK-NEXT:    store double [[G1_IMAG7]], ptr getelementptr inbounds nuw ({ double, double }, ptr @g1, i32 0, i32 1), align 8440// CHECK-NEXT:    [[CI1_REAL:%.*]] = load i32, ptr @ci1, align 4441// CHECK-NEXT:    [[CI1_IMAG:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4442// CHECK-NEXT:    [[INC9:%.*]] = add i32 [[CI1_REAL]], 1443// CHECK-NEXT:    store i32 [[INC9]], ptr @ci1, align 4444// CHECK-NEXT:    store i32 [[CI1_IMAG]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4445// CHECK-NEXT:    [[CI1_REAL10:%.*]] = load i32, ptr @ci1, align 4446// CHECK-NEXT:    [[CI1_IMAG11:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4447// CHECK-NEXT:    [[DEC12:%.*]] = add i32 [[CI1_REAL10]], -1448// CHECK-NEXT:    store i32 [[DEC12]], ptr @ci1, align 4449// CHECK-NEXT:    store i32 [[CI1_IMAG11]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4450// CHECK-NEXT:    [[CI1_REAL13:%.*]] = load i32, ptr @ci1, align 4451// CHECK-NEXT:    [[CI1_IMAG14:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4452// CHECK-NEXT:    [[INC15:%.*]] = add i32 [[CI1_REAL13]], 1453// CHECK-NEXT:    store i32 [[INC15]], ptr @ci1, align 4454// CHECK-NEXT:    store i32 [[CI1_IMAG14]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4455// CHECK-NEXT:    [[CI1_REAL16:%.*]] = load i32, ptr @ci1, align 4456// CHECK-NEXT:    [[CI1_IMAG17:%.*]] = load i32, ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4457// CHECK-NEXT:    [[DEC18:%.*]] = add i32 [[CI1_REAL16]], -1458// CHECK-NEXT:    store i32 [[DEC18]], ptr @ci1, align 4459// CHECK-NEXT:    store i32 [[CI1_IMAG17]], ptr getelementptr inbounds nuw ({ i32, i32 }, ptr @ci1, i32 0, i32 1), align 4460// CHECK-NEXT:    ret void461//462void t6(void) {463  g1++;464  g1--;465  ++g1;466  --g1;467  ci1++;468  ci1--;469  ++ci1;470  --ci1;471}472 473// CHECK-LABEL: define dso_local double @t7(474// CHECK-SAME: double noundef [[C_COERCE0:%.*]], double noundef [[C_COERCE1:%.*]]) #[[ATTR0]] {475// CHECK-NEXT:  [[ENTRY:.*:]]476// CHECK-NEXT:    [[C:%.*]] = alloca { double, double }, align 8477// CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0478// CHECK-NEXT:    store double [[C_COERCE0]], ptr [[TMP0]], align 8479// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 1480// CHECK-NEXT:    store double [[C_COERCE1]], ptr [[TMP1]], align 8481// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[C]], i32 0, i32 0482// CHECK-NEXT:    [[TMP2:%.*]] = load double, ptr [[C_REALP]], align 8483// CHECK-NEXT:    [[TMP3:%.*]] = call double @llvm.fabs.f64(double [[TMP2]])484// CHECK-NEXT:    ret double [[TMP3]]485//486double t7(double _Complex c) {487  return __builtin_fabs(__real__(c));488}489 490// CHECK-LABEL: define dso_local void @t8(491// CHECK-SAME: ) #[[ATTR0]] {492// CHECK-NEXT:  [[ENTRY:.*:]]493// CHECK-NEXT:    [[X:%.*]] = alloca ptr, align 8494// CHECK-NEXT:    [[DOTCOMPOUNDLITERAL:%.*]] = alloca { i32, i32 }, align 4495// CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_REALP:%.*]] = getelementptr inbounds nuw { i32, i32 }, ptr [[DOTCOMPOUNDLITERAL]], i32 0, i32 0496// CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_IMAGP:%.*]] = getelementptr inbounds nuw { i32, i32 }, ptr [[DOTCOMPOUNDLITERAL]], i32 0, i32 1497// CHECK-NEXT:    store i32 1, ptr [[DOTCOMPOUNDLITERAL_REALP]], align 4498// CHECK-NEXT:    store i32 0, ptr [[DOTCOMPOUNDLITERAL_IMAGP]], align 4499// CHECK-NEXT:    store ptr [[DOTCOMPOUNDLITERAL]], ptr [[X]], align 8500// CHECK-NEXT:    ret void501//502void t8(void) {503  __complex__ int *x = &(__complex__ int){1};504}505 506const _Complex double test9const = 0;507// CHECK-LABEL: define dso_local { double, double } @test9func(508// CHECK-SAME: ) #[[ATTR0]] {509// CHECK-NEXT:  [[ENTRY:.*:]]510// CHECK-NEXT:    [[RETVAL:%.*]] = alloca { double, double }, align 8511// CHECK-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 0512// CHECK-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RETVAL]], i32 0, i32 1513// CHECK-NEXT:    store double 0.000000e+00, ptr [[RETVAL_REALP]], align 8514// CHECK-NEXT:    store double 0.000000e+00, ptr [[RETVAL_IMAGP]], align 8515// CHECK-NEXT:    [[TMP0:%.*]] = load { double, double }, ptr [[RETVAL]], align 8516// CHECK-NEXT:    ret { double, double } [[TMP0]]517//518_Complex double test9func(void) { return test9const; }519 520// D6217521// CHECK-LABEL: define dso_local void @t91(522// CHECK-SAME: ) #[[ATTR0]] {523// CHECK-NEXT:  [[ENTRY:.*:]]524// CHECK-NEXT:    [[C:%.*]] = alloca [0 x i8], align 1525// CHECK-NEXT:    br i1 false, label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]526// CHECK:       [[COND_TRUE]]:527// CHECK-NEXT:    br label %[[COND_END:.*]]528// CHECK:       [[COND_FALSE]]:529// CHECK-NEXT:    br label %[[COND_END]]530// CHECK:       [[COND_END]]:531// CHECK-NEXT:    [[COND_R:%.*]] = phi double [ 2.000000e+00, %[[COND_TRUE]] ], [ 2.000000e+00, %[[COND_FALSE]] ]532// CHECK-NEXT:    [[COND_I:%.*]] = phi double [ 0.000000e+00, %[[COND_TRUE]] ], [ 0.000000e+00, %[[COND_FALSE]] ]533// CHECK-NEXT:    ret void534//535void t91(void) {536  // Check for proper type promotion of conditional expression537  char c[(int)(sizeof(typeof((0 ? 2.0f : (_Complex double) 2.0f))) - sizeof(_Complex double))];538  // Check for proper codegen539  (0 ? 2.0f : (_Complex double) 2.0f);540}541 542// CHECK-LABEL: define dso_local void @t92(543// CHECK-SAME: ) #[[ATTR0]] {544// CHECK-NEXT:  [[ENTRY:.*:]]545// CHECK-NEXT:    [[C:%.*]] = alloca [0 x i8], align 1546// CHECK-NEXT:    br i1 false, label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]547// CHECK:       [[COND_TRUE]]:548// CHECK-NEXT:    br label %[[COND_END:.*]]549// CHECK:       [[COND_FALSE]]:550// CHECK-NEXT:    br label %[[COND_END]]551// CHECK:       [[COND_END]]:552// CHECK-NEXT:    [[COND_R:%.*]] = phi double [ 2.000000e+00, %[[COND_TRUE]] ], [ 2.000000e+00, %[[COND_FALSE]] ]553// CHECK-NEXT:    [[COND_I:%.*]] = phi double [ 0.000000e+00, %[[COND_TRUE]] ], [ 0.000000e+00, %[[COND_FALSE]] ]554// CHECK-NEXT:    ret void555//556void t92(void) {557  // Check for proper type promotion of conditional expression558  char c[(int)(sizeof(typeof((0 ? (_Complex double) 2.0f : 2.0f))) - sizeof(_Complex double))];559  // Check for proper codegen560  (0 ? (_Complex double) 2.0f : 2.0f);561}562 563// CHECK-LABEL: define dso_local void @real_on_scalar_with_type_promotion(564// CHECK-SAME: ) #[[ATTR0]] {565// CHECK-NEXT:  [[ENTRY:.*:]]566// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2567// CHECK-NEXT:    [[B:%.*]] = alloca half, align 2568// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0569// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2570// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float571// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half572// CHECK-NEXT:    store half [[UNPROMOTION]], ptr [[B]], align 2573// CHECK-NEXT:    ret void574//575void real_on_scalar_with_type_promotion() {576  _Float16 _Complex a;577  _Float16 b = __real__(__real__ a);578}579 580// CHECK-LABEL: define dso_local void @imag_on_scalar_with_type_promotion(581// CHECK-SAME: ) #[[ATTR0]] {582// CHECK-NEXT:  [[ENTRY:.*:]]583// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2584// CHECK-NEXT:    [[B:%.*]] = alloca half, align 2585// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1586// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2587// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_IMAG]] to float588// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half589// CHECK-NEXT:    store half [[UNPROMOTION]], ptr [[B]], align 2590// CHECK-NEXT:    ret void591//592void imag_on_scalar_with_type_promotion() {593  _Float16 _Complex a;594  _Float16 b = __real__(__imag__ a);595}596