66// X64-LABEL: define dso_local double @test_double_post_inc(
77// X64-SAME: ) #[[ATTR0:[0-9]+]] {
88// X64-NEXT: entry:
9- // X64-NEXT: [[RETVAL:%.*]] = alloca double, align 8
10- // X64-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_post_inc.n, float 1.000000e+00 seq_cst, align 8
11- // X64-NEXT: store float [[TMP0]], ptr [[RETVAL]], align 8
12- // X64-NEXT: [[TMP1:%.*]] = load double, ptr [[RETVAL]], align 8
13- // X64-NEXT: ret double [[TMP1]]
9+ // X64-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_post_inc.n, double 1.000000e+00 seq_cst, align 8
10+ // X64-NEXT: ret double [[TMP0]]
1411//
1512// X86-LABEL: define dso_local double @test_double_post_inc(
1613// X86-SAME: ) #[[ATTR0:[0-9]+]] {
1714// X86-NEXT: entry:
18- // X86-NEXT: [[RETVAL:%.*]] = alloca double, align 4
19- // X86-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_post_inc.n, float 1.000000e+00 seq_cst, align 8
20- // X86-NEXT: store float [[TMP0]], ptr [[RETVAL]], align 4
21- // X86-NEXT: [[TMP1:%.*]] = load double, ptr [[RETVAL]], align 4
22- // X86-NEXT: ret double [[TMP1]]
15+ // X86-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_post_inc.n, double 1.000000e+00 seq_cst, align 8
16+ // X86-NEXT: ret double [[TMP0]]
2317//
2418double test_double_post_inc ()
2519{
@@ -30,20 +24,14 @@ double test_double_post_inc()
3024// X64-LABEL: define dso_local double @test_double_post_dc(
3125// X64-SAME: ) #[[ATTR0]] {
3226// X64-NEXT: entry:
33- // X64-NEXT: [[RETVAL:%.*]] = alloca double, align 8
34- // X64-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_post_dc.n, float 1.000000e+00 seq_cst, align 8
35- // X64-NEXT: store float [[TMP0]], ptr [[RETVAL]], align 8
36- // X64-NEXT: [[TMP1:%.*]] = load double, ptr [[RETVAL]], align 8
37- // X64-NEXT: ret double [[TMP1]]
27+ // X64-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_post_dc.n, double 1.000000e+00 seq_cst, align 8
28+ // X64-NEXT: ret double [[TMP0]]
3829//
3930// X86-LABEL: define dso_local double @test_double_post_dc(
4031// X86-SAME: ) #[[ATTR0]] {
4132// X86-NEXT: entry:
42- // X86-NEXT: [[RETVAL:%.*]] = alloca double, align 4
43- // X86-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_post_dc.n, float 1.000000e+00 seq_cst, align 8
44- // X86-NEXT: store float [[TMP0]], ptr [[RETVAL]], align 4
45- // X86-NEXT: [[TMP1:%.*]] = load double, ptr [[RETVAL]], align 4
46- // X86-NEXT: ret double [[TMP1]]
33+ // X86-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_post_dc.n, double 1.000000e+00 seq_cst, align 8
34+ // X86-NEXT: ret double [[TMP0]]
4735//
4836double test_double_post_dc ()
4937{
@@ -54,22 +42,16 @@ double test_double_post_dc()
5442// X64-LABEL: define dso_local double @test_double_pre_dc(
5543// X64-SAME: ) #[[ATTR0]] {
5644// X64-NEXT: entry:
57- // X64-NEXT: [[RETVAL:%.*]] = alloca double, align 8
58- // X64-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_pre_dc.n, float 1.000000e+00 seq_cst, align 8
59- // X64-NEXT: [[TMP1:%.*]] = fsub float [[TMP0]], 1.000000e+00
60- // X64-NEXT: store float [[TMP1]], ptr [[RETVAL]], align 8
61- // X64-NEXT: [[TMP2:%.*]] = load double, ptr [[RETVAL]], align 8
62- // X64-NEXT: ret double [[TMP2]]
45+ // X64-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_pre_dc.n, double 1.000000e+00 seq_cst, align 8
46+ // X64-NEXT: [[TMP1:%.*]] = fsub double [[TMP0]], 1.000000e+00
47+ // X64-NEXT: ret double [[TMP1]]
6348//
6449// X86-LABEL: define dso_local double @test_double_pre_dc(
6550// X86-SAME: ) #[[ATTR0]] {
6651// X86-NEXT: entry:
67- // X86-NEXT: [[RETVAL:%.*]] = alloca double, align 4
68- // X86-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_pre_dc.n, float 1.000000e+00 seq_cst, align 8
69- // X86-NEXT: [[TMP1:%.*]] = fsub float [[TMP0]], 1.000000e+00
70- // X86-NEXT: store float [[TMP1]], ptr [[RETVAL]], align 4
71- // X86-NEXT: [[TMP2:%.*]] = load double, ptr [[RETVAL]], align 4
72- // X86-NEXT: ret double [[TMP2]]
52+ // X86-NEXT: [[TMP0:%.*]] = atomicrmw fsub ptr @test_double_pre_dc.n, double 1.000000e+00 seq_cst, align 8
53+ // X86-NEXT: [[TMP1:%.*]] = fsub double [[TMP0]], 1.000000e+00
54+ // X86-NEXT: ret double [[TMP1]]
7355//
7456double test_double_pre_dc ()
7557{
@@ -80,25 +62,43 @@ double test_double_pre_dc()
8062// X64-LABEL: define dso_local double @test_double_pre_inc(
8163// X64-SAME: ) #[[ATTR0]] {
8264// X64-NEXT: entry:
83- // X64-NEXT: [[RETVAL:%.*]] = alloca double, align 8
84- // X64-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_pre_inc.n, float 1.000000e+00 seq_cst, align 8
85- // X64-NEXT: [[TMP1:%.*]] = fadd float [[TMP0]], 1.000000e+00
86- // X64-NEXT: store float [[TMP1]], ptr [[RETVAL]], align 8
87- // X64-NEXT: [[TMP2:%.*]] = load double, ptr [[RETVAL]], align 8
88- // X64-NEXT: ret double [[TMP2]]
65+ // X64-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_pre_inc.n, double 1.000000e+00 seq_cst, align 8
66+ // X64-NEXT: [[TMP1:%.*]] = fadd double [[TMP0]], 1.000000e+00
67+ // X64-NEXT: ret double [[TMP1]]
8968//
9069// X86-LABEL: define dso_local double @test_double_pre_inc(
9170// X86-SAME: ) #[[ATTR0]] {
9271// X86-NEXT: entry:
93- // X86-NEXT: [[RETVAL:%.*]] = alloca double, align 4
94- // X86-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_pre_inc.n, float 1.000000e+00 seq_cst, align 8
95- // X86-NEXT: [[TMP1:%.*]] = fadd float [[TMP0]], 1.000000e+00
96- // X86-NEXT: store float [[TMP1]], ptr [[RETVAL]], align 4
97- // X86-NEXT: [[TMP2:%.*]] = load double, ptr [[RETVAL]], align 4
98- // X86-NEXT: ret double [[TMP2]]
72+ // X86-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @test_double_pre_inc.n, double 1.000000e+00 seq_cst, align 8
73+ // X86-NEXT: [[TMP1:%.*]] = fadd double [[TMP0]], 1.000000e+00
74+ // X86-NEXT: ret double [[TMP1]]
9975//
10076double test_double_pre_inc ()
10177{
10278 static _Atomic double n ;
10379 return ++ n ;
10480}
81+
82+ // X64-LABEL: define dso_local i32 @pr107054(
83+ // X64-SAME: ) #[[ATTR0]] {
84+ // X64-NEXT: entry:
85+ // X64-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @pr107054.n, double 1.000000e+00 seq_cst, align 8
86+ // X64-NEXT: [[TMP1:%.*]] = fadd double [[TMP0]], 1.000000e+00
87+ // X64-NEXT: [[CMP:%.*]] = fcmp oeq double [[TMP1]], 1.000000e+00
88+ // X64-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
89+ // X64-NEXT: ret i32 [[CONV]]
90+ //
91+ // X86-LABEL: define dso_local i32 @pr107054(
92+ // X86-SAME: ) #[[ATTR0]] {
93+ // X86-NEXT: entry:
94+ // X86-NEXT: [[TMP0:%.*]] = atomicrmw fadd ptr @pr107054.n, double 1.000000e+00 seq_cst, align 8
95+ // X86-NEXT: [[TMP1:%.*]] = fadd double [[TMP0]], 1.000000e+00
96+ // X86-NEXT: [[CMP:%.*]] = fcmp oeq double [[TMP1]], 1.000000e+00
97+ // X86-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32
98+ // X86-NEXT: ret i32 [[CONV]]
99+ //
100+ int pr107054 ()
101+ {
102+ static _Atomic double n ;
103+ return (++ n ) == 1 ;
104+ }
0 commit comments