1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -passes=early-cse -earlycse-debug-hash | FileCheck %s 3; RUN: opt < %s -S -passes='early-cse<memssa>' | FileCheck %s 4 5; Test use of constrained floating point intrinsics in the default 6; floating point environment. 7 8define double @multiple_fadd(double %a, double %b) #0 { 9; CHECK-LABEL: @multiple_fadd( 10; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0:[0-9]+]] 11; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 12; CHECK-NEXT: ret double [[TMP1]] 13; 14 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 15 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 16 %3 = call double @foo.f64(double %1, double %2) #0 17 ret double %2 18} 19 20define double @multiple_fadd_split(double %a, double %b) #0 { 21; CHECK-LABEL: @multiple_fadd_split( 22; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 23; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 24; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 25; CHECK-NEXT: ret double [[TMP1]] 26; 27 %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 28 call void @arbitraryfunc() #0 29 %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 30 %3 = call double @foo.f64(double %1, double %2) #0 31 ret double %2 32} 33 34define double @multiple_fsub(double %a, double %b) #0 { 35; CHECK-LABEL: @multiple_fsub( 36; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 37; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 38; CHECK-NEXT: ret double [[TMP1]] 39; 40 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 41 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 42 %3 = call double @foo.f64(double %1, double %2) #0 43 ret double %2 44} 45 46define double @multiple_fsub_split(double %a, double %b) #0 { 47; CHECK-LABEL: @multiple_fsub_split( 48; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 49; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 50; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 51; CHECK-NEXT: ret double [[TMP1]] 52; 53 %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 54 call void @arbitraryfunc() #0 55 %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 56 %3 = call double @foo.f64(double %1, double %2) #0 57 ret double %2 58} 59 60define double @multiple_fmul(double %a, double %b) #0 { 61; CHECK-LABEL: @multiple_fmul( 62; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 63; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 64; CHECK-NEXT: ret double [[TMP1]] 65; 66 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 67 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 68 %3 = call double @foo.f64(double %1, double %2) #0 69 ret double %2 70} 71 72define double @multiple_fmul_split(double %a, double %b) #0 { 73; CHECK-LABEL: @multiple_fmul_split( 74; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 75; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 76; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 77; CHECK-NEXT: ret double [[TMP1]] 78; 79 %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 80 call void @arbitraryfunc() #0 81 %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 82 %3 = call double @foo.f64(double %1, double %2) #0 83 ret double %2 84} 85 86define double @multiple_fdiv(double %a, double %b) #0 { 87; CHECK-LABEL: @multiple_fdiv( 88; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 89; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 90; CHECK-NEXT: ret double [[TMP1]] 91; 92 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 93 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 94 %3 = call double @foo.f64(double %1, double %2) #0 95 ret double %2 96} 97 98define double @multiple_fdiv_split(double %a, double %b) #0 { 99; CHECK-LABEL: @multiple_fdiv_split( 100; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 101; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 102; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 103; CHECK-NEXT: ret double [[TMP1]] 104; 105 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 106 call void @arbitraryfunc() #0 107 %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 108 %3 = call double @foo.f64(double %1, double %2) #0 109 ret double %2 110} 111 112define double @multiple_frem(double %a, double %b) #0 { 113; CHECK-LABEL: @multiple_frem( 114; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 115; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 116; CHECK-NEXT: ret double [[TMP1]] 117; 118 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 119 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 120 %3 = call double @foo.f64(double %1, double %2) #0 121 ret double %2 122} 123 124define double @multiple_frem_split(double %a, double %b) #0 { 125; CHECK-LABEL: @multiple_frem_split( 126; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 127; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 128; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 129; CHECK-NEXT: ret double [[TMP1]] 130; 131 %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 132 call void @arbitraryfunc() #0 133 %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 134 %3 = call double @foo.f64(double %1, double %2) #0 135 ret double %2 136} 137 138define i32 @multiple_fptoui(double %a) #0 { 139; CHECK-LABEL: @multiple_fptoui( 140; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]] 141; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]] 142; CHECK-NEXT: ret i32 [[TMP1]] 143; 144 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0 145 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0 146 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0 147 ret i32 %2 148} 149 150define i32 @multiple_fptoui_split(double %a, double %b) #0 { 151; CHECK-LABEL: @multiple_fptoui_split( 152; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]] 153; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 154; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]] 155; CHECK-NEXT: ret i32 [[TMP1]] 156; 157 %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0 158 call void @arbitraryfunc() #0 159 %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.ignore") #0 160 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0 161 ret i32 %2 162} 163 164define double @multiple_uitofp(i32 %a) #0 { 165; CHECK-LABEL: @multiple_uitofp( 166; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 167; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 168; CHECK-NEXT: ret double [[TMP1]] 169; 170 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 171 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 172 %3 = call double @foo.f64(double %1, double %1) #0 173 ret double %2 174} 175 176define double @multiple_uitofp_split(i32 %a) #0 { 177; CHECK-LABEL: @multiple_uitofp_split( 178; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 179; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 180; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 181; CHECK-NEXT: ret double [[TMP1]] 182; 183 %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 184 call void @arbitraryfunc() #0 185 %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 186 %3 = call double @foo.f64(double %1, double %1) #0 187 ret double %2 188} 189 190define i32 @multiple_fptosi(double %a) #0 { 191; CHECK-LABEL: @multiple_fptosi( 192; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]] 193; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]] 194; CHECK-NEXT: ret i32 [[TMP1]] 195; 196 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0 197 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0 198 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0 199 ret i32 %2 200} 201 202define i32 @multiple_fptosi_split(double %a, double %b) #0 { 203; CHECK-LABEL: @multiple_fptosi_split( 204; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.ignore") #[[ATTR0]] 205; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 206; CHECK-NEXT: [[TMP2:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]] 207; CHECK-NEXT: ret i32 [[TMP1]] 208; 209 %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0 210 call void @arbitraryfunc() #0 211 %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.ignore") #0 212 %3 = call i32 @bar.i32(i32 %1, i32 %1) #0 213 ret i32 %2 214} 215 216define double @multiple_sitofp(i32 %a) #0 { 217; CHECK-LABEL: @multiple_sitofp( 218; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 219; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 220; CHECK-NEXT: ret double [[TMP1]] 221; 222 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 223 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 224 %3 = call double @foo.f64(double %1, double %1) #0 225 ret double %2 226} 227 228define double @multiple_sitofp_split(i32 %a) #0 { 229; CHECK-LABEL: @multiple_sitofp_split( 230; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.ignore") #[[ATTR0]] 231; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 232; CHECK-NEXT: [[TMP2:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]] 233; CHECK-NEXT: ret double [[TMP1]] 234; 235 %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 236 call void @arbitraryfunc() #0 237 %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.ignore") #0 238 %3 = call double @foo.f64(double %1, double %1) #0 239 ret double %2 240} 241 242define i1 @multiple_fcmp(double %a, double %b) #0 { 243; CHECK-LABEL: @multiple_fcmp( 244; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]] 245; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32 246; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]] 247; CHECK-NEXT: ret i1 [[TMP1]] 248; 249 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 250 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 251 %3 = zext i1 %1 to i32 252 %4 = zext i1 %2 to i32 253 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0 254 ret i1 %2 255} 256 257define i1 @multiple_fcmp_split(double %a, double %b) #0 { 258; CHECK-LABEL: @multiple_fcmp_split( 259; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]] 260; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 261; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32 262; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]] 263; CHECK-NEXT: ret i1 [[TMP1]] 264; 265 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 266 call void @arbitraryfunc() #0 267 %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 268 %3 = zext i1 %1 to i32 269 %4 = zext i1 %2 to i32 270 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0 271 ret i1 %2 272} 273 274define i1 @multiple_fcmps(double %a, double %b) #0 { 275; CHECK-LABEL: @multiple_fcmps( 276; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]] 277; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32 278; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]] 279; CHECK-NEXT: ret i1 [[TMP1]] 280; 281 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 282 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 283 %3 = zext i1 %1 to i32 284 %4 = zext i1 %2 to i32 285 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0 286 ret i1 %2 287} 288 289define i1 @multiple_fcmps_split(double %a, double %b) #0 { 290; CHECK-LABEL: @multiple_fcmps_split( 291; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.ignore") #[[ATTR0]] 292; CHECK-NEXT: call void @arbitraryfunc() #[[ATTR0]] 293; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32 294; CHECK-NEXT: [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP2]], i32 [[TMP2]]) #[[ATTR0]] 295; CHECK-NEXT: ret i1 [[TMP1]] 296; 297 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 298 call void @arbitraryfunc() #0 299 %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.ignore") #0 300 %3 = zext i1 %1 to i32 301 %4 = zext i1 %2 to i32 302 %5 = call i32 @bar.i32(i32 %3, i32 %4) #0 303 ret i1 %2 304} 305 306attributes #0 = { strictfp } 307 308declare void @arbitraryfunc() #0 309declare double @foo.f64(double, double) #0 310declare i32 @bar.i32(i32, i32) #0 311 312declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata) 313declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) 314declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata) 315declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata) 316declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata) 317declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata) 318declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata) 319declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata) 320declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata) 321declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) 322declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata) 323