@@ -14,57 +14,63 @@ struct S a[5];
1414// CHECK-NEXT: [[P:%.*]] = alloca ptr, align 8
1515// CHECK-NEXT: [[AP:%.*]] = alloca [1 x %struct.__va_list_tag], align 16
1616// CHECK-NEXT: [[J:%.*]] = alloca i32, align 4
17+ // CHECK-NEXT: [[FREEZE_POISON:%.*]] = freeze i32 poison
18+ // CHECK-NEXT: store i32 [[FREEZE_POISON]], ptr [[J]], align 4
1719// CHECK-NEXT: [[K:%.*]] = alloca i32, align 4
20+ // CHECK-NEXT: [[FREEZE_POISON1:%.*]] = freeze i32 poison
21+ // CHECK-NEXT: store i32 [[FREEZE_POISON1]], ptr [[K]], align 4
1822// CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
23+ // CHECK-NEXT: [[FREEZE_POISON2:%.*]] = freeze i32 poison
24+ // CHECK-NEXT: store i32 [[FREEZE_POISON2]], ptr [[I]], align 4
1925// CHECK-NEXT: [[TMP:%.*]] = alloca [[STRUCT_S]], align 4
2026// CHECK-NEXT: store i32 [[Z:%.*]], ptr [[Z_ADDR]], align 4
2127// CHECK-NEXT: store i32 0, ptr [[J]], align 4
2228// CHECK-NEXT: store i32 0, ptr [[K]], align 4
2329// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr [[AP]], i64 0, i64 0
2430// CHECK-NEXT: call void @llvm.va_start.p0(ptr [[ARRAYDECAY]])
2531// CHECK-NEXT: store ptr getelementptr inbounds ([5 x %struct.S], ptr @a, i64 0, i64 2), ptr [[P]], align 8
26- // CHECK-NEXT: [[ARRAYDECAY2 :%.*]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr [[AP]], i64 0, i64 0
27- // CHECK-NEXT: [[FP_OFFSET_P:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG:%.*]], ptr [[ARRAYDECAY2 ]], i32 0, i32 1
28- // CHECK-NEXT: [[FP_OFFSET:%.*]] = load i32, ptr [[FP_OFFSET_P]], align 4
32+ // CHECK-NEXT: [[ARRAYDECAY3 :%.*]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr [[AP]], i64 0, i64 0
33+ // CHECK-NEXT: [[FP_OFFSET_P:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG:%.*]], ptr [[ARRAYDECAY3 ]], i32 0, i32 1
34+ // CHECK-NEXT: [[FP_OFFSET:%.*]] = load i32, ptr [[FP_OFFSET_P]], align 4, !freeze_bits [[META2:![0-9]+]]
2935// CHECK-NEXT: [[FITS_IN_FP:%.*]] = icmp ule i32 [[FP_OFFSET]], 144
3036// CHECK-NEXT: br i1 [[FITS_IN_FP]], label [[VAARG_IN_REG:%.*]], label [[VAARG_IN_MEM:%.*]]
3137// CHECK: vaarg.in_reg:
32- // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG]], ptr [[ARRAYDECAY2 ]], i32 0, i32 3
33- // CHECK-NEXT: [[REG_SAVE_AREA:%.*]] = load ptr, ptr [[TMP0]], align 16
38+ // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG]], ptr [[ARRAYDECAY3 ]], i32 0, i32 3
39+ // CHECK-NEXT: [[REG_SAVE_AREA:%.*]] = load ptr, ptr [[TMP0]], align 16, !freeze_bits [[META2]]
3440// CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[REG_SAVE_AREA]], i32 [[FP_OFFSET]]
3541// CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i64 16
36- // CHECK-NEXT: [[TMP5 :%.*]] = load <2 x float>, ptr [[TMP1]], align 16
37- // CHECK-NEXT: [[TMP6 :%.*]] = getelementptr inbounds { <2 x float>, float }, ptr [[TMP]], i32 0, i32 0
38- // CHECK-NEXT: store <2 x float> [[TMP5 ]], ptr [[TMP6 ]], align 4
39- // CHECK-NEXT: [[TMP8 :%.*]] = load float, ptr [[TMP2]], align 16
40- // CHECK-NEXT: [[TMP9 :%.*]] = getelementptr inbounds { <2 x float>, float }, ptr [[TMP]], i32 0, i32 1
41- // CHECK-NEXT: store float [[TMP8 ]], ptr [[TMP9 ]], align 4
42- // CHECK-NEXT: [[TMP11 :%.*]] = add i32 [[FP_OFFSET]], 32
43- // CHECK-NEXT: store i32 [[TMP11 ]], ptr [[FP_OFFSET_P]], align 4
42+ // CHECK-NEXT: [[TMP3 :%.*]] = load <2 x float>, ptr [[TMP1]], align 16, !freeze_bits [[META2]]
43+ // CHECK-NEXT: [[TMP4 :%.*]] = getelementptr inbounds { <2 x float>, float }, ptr [[TMP]], i32 0, i32 0
44+ // CHECK-NEXT: store <2 x float> [[TMP3 ]], ptr [[TMP4 ]], align 4
45+ // CHECK-NEXT: [[TMP5 :%.*]] = load float, ptr [[TMP2]], align 16, !freeze_bits [[META2]]
46+ // CHECK-NEXT: [[TMP6 :%.*]] = getelementptr inbounds { <2 x float>, float }, ptr [[TMP]], i32 0, i32 1
47+ // CHECK-NEXT: store float [[TMP5 ]], ptr [[TMP6 ]], align 4
48+ // CHECK-NEXT: [[TMP7 :%.*]] = add i32 [[FP_OFFSET]], 32
49+ // CHECK-NEXT: store i32 [[TMP7 ]], ptr [[FP_OFFSET_P]], align 4
4450// CHECK-NEXT: br label [[VAARG_END:%.*]]
4551// CHECK: vaarg.in_mem:
46- // CHECK-NEXT: [[OVERFLOW_ARG_AREA_P:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG]], ptr [[ARRAYDECAY2 ]], i32 0, i32 2
47- // CHECK-NEXT: [[OVERFLOW_ARG_AREA:%.*]] = load ptr, ptr [[OVERFLOW_ARG_AREA_P]], align 8
52+ // CHECK-NEXT: [[OVERFLOW_ARG_AREA_P:%.*]] = getelementptr inbounds [[STRUCT___VA_LIST_TAG]], ptr [[ARRAYDECAY3 ]], i32 0, i32 2
53+ // CHECK-NEXT: [[OVERFLOW_ARG_AREA:%.*]] = load ptr, ptr [[OVERFLOW_ARG_AREA_P]], align 8, !freeze_bits [[META2]]
4854// CHECK-NEXT: [[OVERFLOW_ARG_AREA_NEXT:%.*]] = getelementptr i8, ptr [[OVERFLOW_ARG_AREA]], i32 16
4955// CHECK-NEXT: store ptr [[OVERFLOW_ARG_AREA_NEXT]], ptr [[OVERFLOW_ARG_AREA_P]], align 8
5056// CHECK-NEXT: br label [[VAARG_END]]
5157// CHECK: vaarg.end:
5258// CHECK-NEXT: [[VAARG_ADDR:%.*]] = phi ptr [ [[TMP]], [[VAARG_IN_REG]] ], [ [[OVERFLOW_ARG_AREA]], [[VAARG_IN_MEM]] ]
5359// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARG]], ptr align 4 [[VAARG_ADDR]], i64 12, i1 false)
54- // CHECK-NEXT: [[ARRAYDECAY3 :%.*]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr [[AP]], i64 0, i64 0
55- // CHECK-NEXT: call void @llvm.va_end.p0(ptr [[ARRAYDECAY3 ]])
56- // CHECK-NEXT: [[TMP15 :%.*]] = load ptr, ptr [[P]], align 8
57- // CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[TMP15 ]], null
60+ // CHECK-NEXT: [[ARRAYDECAY4 :%.*]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr [[AP]], i64 0, i64 0
61+ // CHECK-NEXT: call void @llvm.va_end.p0(ptr [[ARRAYDECAY4 ]])
62+ // CHECK-NEXT: [[TMP8 :%.*]] = load ptr, ptr [[P]], align 8, !freeze_bits [[META2]]
63+ // CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[TMP8 ]], null
5864// CHECK-NEXT: br i1 [[TOBOOL]], label [[LAND_LHS_TRUE:%.*]], label [[IF_END:%.*]]
5965// CHECK: land.lhs.true:
60- // CHECK-NEXT: [[TMP16 :%.*]] = load ptr, ptr [[P]], align 8
61- // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[TMP16 ]], i32 0, i32 0
66+ // CHECK-NEXT: [[TMP9 :%.*]] = load ptr, ptr [[P]], align 8, !freeze_bits [[META2]]
67+ // CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[TMP9 ]], i32 0, i32 0
6268// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [3 x float], ptr [[A]], i64 0, i64 2
63- // CHECK-NEXT: [[TMP17 :%.*]] = load float, ptr [[ARRAYIDX]], align 4
69+ // CHECK-NEXT: [[TMP10 :%.*]] = load float, ptr [[ARRAYIDX]], align 4, !freeze_bits [[META2]]
6470// CHECK-NEXT: [[A5:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[ARG]], i32 0, i32 0
6571// CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [3 x float], ptr [[A5]], i64 0, i64 2
66- // CHECK-NEXT: [[TMP18 :%.*]] = load float, ptr [[ARRAYIDX6]], align 4
67- // CHECK-NEXT: [[CMP:%.*]] = fcmp une float [[TMP17 ]], [[TMP18 ]]
72+ // CHECK-NEXT: [[TMP11 :%.*]] = load float, ptr [[ARRAYIDX6]], align 4, !freeze_bits [[META2]]
73+ // CHECK-NEXT: [[CMP:%.*]] = fcmp une float [[TMP10 ]], [[TMP11 ]]
6874// CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END]]
6975// CHECK: if.then:
7076// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 4
@@ -73,8 +79,8 @@ struct S a[5];
7379// CHECK-NEXT: store i32 1, ptr [[RETVAL]], align 4
7480// CHECK-NEXT: br label [[RETURN]]
7581// CHECK: return:
76- // CHECK-NEXT: [[TMP19 :%.*]] = load i32, ptr [[RETVAL]], align 4
77- // CHECK-NEXT: ret i32 [[TMP19 ]]
82+ // CHECK-NEXT: [[TMP12 :%.*]] = load i32, ptr [[RETVAL]], align 4, !freeze_bits [[META2]]
83+ // CHECK-NEXT: ret i32 [[TMP12 ]]
7884//
7985int check (int z , ...)
8086{
0 commit comments