1; RUN: llvm-as < %s | llvm-dis | FileCheck %s 2 3; Test to verify that constrained intrinsics all have the strictfp attribute. 4; Ordering is from Intrinsics.td. 5 6define void @func(double %a, double %b, double %c, i32 %i) strictfp { 7; CHECK-LABEL: define void @func 8; CHECK-SAME: (double [[A:%.*]], double [[B:%.*]], double [[C:%.*]], i32 [[I:%.*]]) #[[ATTR0:[0-9]+]] { 9 10 %add = call double @llvm.experimental.constrained.fadd.f64( 11 double %a, double %b, 12 metadata !"round.dynamic", 13 metadata !"fpexcept.strict") 14 15 %sub = call double @llvm.experimental.constrained.fsub.f64( 16 double %a, double %b, 17 metadata !"round.dynamic", 18 metadata !"fpexcept.strict") 19 20 %mul = call double @llvm.experimental.constrained.fmul.f64( 21 double %a, double %b, 22 metadata !"round.dynamic", 23 metadata !"fpexcept.strict") 24 25 %div = call double @llvm.experimental.constrained.fdiv.f64( 26 double %a, double %b, 27 metadata !"round.dynamic", 28 metadata !"fpexcept.strict") 29 30 %rem = call double @llvm.experimental.constrained.frem.f64( 31 double %a, double %b, 32 metadata !"round.dynamic", 33 metadata !"fpexcept.strict") 34 35 %fma = call double @llvm.experimental.constrained.fma.f64( 36 double %a, double %b, double %c, 37 metadata !"round.dynamic", 38 metadata !"fpexcept.strict") 39 40 %fmuladd = call double @llvm.experimental.constrained.fmuladd.f64( 41 double %a, double %b, double %c, 42 metadata !"round.dynamic", 43 metadata !"fpexcept.strict") 44 45 %si = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, 46 metadata !"fpexcept.strict") 47 48 %ui = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, 49 metadata !"fpexcept.strict") 50 51 %sfp = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %i, 52 metadata !"round.dynamic", 53 metadata !"fpexcept.strict") 54 55 %ufp = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %i, 56 metadata !"round.dynamic", 57 metadata !"fpexcept.strict") 58 59 %fptrunc = call float @llvm.experimental.constrained.fptrunc.f32.f64( 60 double %a, 61 metadata !"round.dynamic", 62 metadata !"fpexcept.strict") 63 64 %ext = call double @llvm.experimental.constrained.fpext.f64.f32( 65 float %fptrunc, 66 metadata !"fpexcept.strict") 67 68 %sqrt = call double @llvm.experimental.constrained.sqrt.f64( 69 double %a, 70 metadata !"round.dynamic", 71 metadata !"fpexcept.strict") 72 73 %powi = call double @llvm.experimental.constrained.powi.f64( 74 double %a, i32 %i, 75 metadata !"round.dynamic", 76 metadata !"fpexcept.strict") 77 78 %sin = call double @llvm.experimental.constrained.sin.f64( 79 double %a, 80 metadata !"round.dynamic", 81 metadata !"fpexcept.strict") 82 83 %cos = call double @llvm.experimental.constrained.cos.f64( 84 double %a, 85 metadata !"round.dynamic", 86 metadata !"fpexcept.strict") 87 88 %tan = call double @llvm.experimental.constrained.tan.f64( 89 double %a, 90 metadata !"round.dynamic", 91 metadata !"fpexcept.strict") 92 93 %acos = call double @llvm.experimental.constrained.acos.f64( 94 double %a, 95 metadata !"round.dynamic", 96 metadata !"fpexcept.strict") 97 98 %asin = call double @llvm.experimental.constrained.asin.f64( 99 double %a, 100 metadata !"round.dynamic", 101 metadata !"fpexcept.strict") 102 103 %atan = call double @llvm.experimental.constrained.atan.f64( 104 double %a, 105 metadata !"round.dynamic", 106 metadata !"fpexcept.strict") 107 108 %atan2 = call double @llvm.experimental.constrained.atan2.f64( 109 double %a, double %b, 110 metadata !"round.dynamic", 111 metadata !"fpexcept.strict") 112 113 %cosh = call double @llvm.experimental.constrained.cosh.f64( 114 double %a, 115 metadata !"round.dynamic", 116 metadata !"fpexcept.strict") 117 118 %sinh = call double @llvm.experimental.constrained.sinh.f64( 119 double %a, 120 metadata !"round.dynamic", 121 metadata !"fpexcept.strict") 122 123 %tanh = call double @llvm.experimental.constrained.tanh.f64( 124 double %a, 125 metadata !"round.dynamic", 126 metadata !"fpexcept.strict") 127 128 %pow = call double @llvm.experimental.constrained.pow.f64( 129 double %a, double %b, 130 metadata !"round.dynamic", 131 metadata !"fpexcept.strict") 132 133 %log = call double @llvm.experimental.constrained.log.f64( 134 double %a, 135 metadata !"round.dynamic", 136 metadata !"fpexcept.strict") 137 138 %log10 = call double @llvm.experimental.constrained.log10.f64( 139 double %a, 140 metadata !"round.dynamic", 141 metadata !"fpexcept.strict") 142 143 %log2 = call double @llvm.experimental.constrained.log2.f64( 144 double %a, 145 metadata !"round.dynamic", 146 metadata !"fpexcept.strict") 147 148 %exp = call double @llvm.experimental.constrained.exp.f64( 149 double %a, 150 metadata !"round.dynamic", 151 metadata !"fpexcept.strict") 152 153 %exp2 = call double @llvm.experimental.constrained.exp2.f64( 154 double %a, 155 metadata !"round.dynamic", 156 metadata !"fpexcept.strict") 157 158 %rint = call double @llvm.experimental.constrained.rint.f64( 159 double %a, 160 metadata !"round.dynamic", 161 metadata !"fpexcept.strict") 162 163 %neari = call double @llvm.experimental.constrained.nearbyint.f64( 164 double %a, 165 metadata !"round.dynamic", 166 metadata !"fpexcept.strict") 167 168 %x32 = call i32 @llvm.experimental.constrained.lrint.i32.f64( 169 double %a, 170 metadata !"round.dynamic", 171 metadata !"fpexcept.strict") 172 173 %x64 = call i64 @llvm.experimental.constrained.llrint.i64.f64( 174 double %a, 175 metadata !"round.dynamic", 176 metadata !"fpexcept.strict") 177 178 %maxnum = call double @llvm.experimental.constrained.maxnum.f64( 179 double %a, double %b, 180 metadata !"fpexcept.strict") 181 182 %minnum = call double @llvm.experimental.constrained.minnum.f64( 183 double %a, double %b, 184 metadata !"fpexcept.strict") 185 186 %maxmum = call double @llvm.experimental.constrained.maximum.f64( 187 double %a, double %b, 188 metadata !"fpexcept.strict") 189 190 %minmum = call double @llvm.experimental.constrained.minimum.f64( 191 double %a, double %b, 192 metadata !"fpexcept.strict") 193 194 %ceil = call double @llvm.experimental.constrained.ceil.f64( 195 double %a, 196 metadata !"fpexcept.strict") 197 198 %floor = call double @llvm.experimental.constrained.floor.f64( 199 double %a, 200 metadata !"fpexcept.strict") 201 202 %y32 = call i32 @llvm.experimental.constrained.lround.i32.f64( 203 double %a, 204 metadata !"fpexcept.strict") 205 206 %y64 = call i64 @llvm.experimental.constrained.llround.i64.f64( 207 double %a, 208 metadata !"fpexcept.strict") 209 210 %round = call double @llvm.experimental.constrained.round.f64( 211 double %a, 212 metadata !"fpexcept.strict") 213 214 %roundev = call double @llvm.experimental.constrained.roundeven.f64( 215 double %a, 216 metadata !"fpexcept.strict") 217 218 %trunc = call double @llvm.experimental.constrained.trunc.f64( 219 double %a, 220 metadata !"fpexcept.strict") 221 222 %q1 = call i1 @llvm.experimental.constrained.fcmp.f64( 223 double %a, double %b, 224 metadata !"oeq", 225 metadata !"fpexcept.strict") 226 227 %s1 = call i1 @llvm.experimental.constrained.fcmps.f64( 228 double %a, double %b, 229 metadata !"oeq", 230 metadata !"fpexcept.strict") 231 232; CHECK: ret void 233 ret void 234} 235 236declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata) 237; CHECK: @llvm.experimental.constrained.fadd.f64({{.*}}) #[[ATTR1:[0-9]+]] 238 239declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) 240; CHECK: @llvm.experimental.constrained.fsub.f64({{.*}}) #[[ATTR1]] 241 242declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata) 243; CHECK: @llvm.experimental.constrained.fmul.f64({{.*}}) #[[ATTR1]] 244 245declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata) 246; CHECK: @llvm.experimental.constrained.fdiv.f64({{.*}}) #[[ATTR1]] 247 248declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata) 249; CHECK: @llvm.experimental.constrained.frem.f64({{.*}}) #[[ATTR1]] 250 251declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) 252; CHECK: @llvm.experimental.constrained.fma.f64({{.*}}) #[[ATTR1]] 253 254declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata) 255; CHECK: @llvm.experimental.constrained.fmuladd.f64({{.*}}) #[[ATTR1]] 256 257declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata) 258; CHECK: @llvm.experimental.constrained.fptosi.i32.f64({{.*}}) #[[ATTR1]] 259 260declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata) 261; CHECK: @llvm.experimental.constrained.fptoui.i32.f64({{.*}}) #[[ATTR1]] 262 263declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata) 264; CHECK: @llvm.experimental.constrained.sitofp.f64.i32({{.*}}) #[[ATTR1]] 265 266declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata) 267; CHECK: @llvm.experimental.constrained.uitofp.f64.i32({{.*}}) #[[ATTR1]] 268 269declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata) 270; CHECK: @llvm.experimental.constrained.fptrunc.f32.f64({{.*}}) #[[ATTR1]] 271 272declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata) 273; CHECK: @llvm.experimental.constrained.fpext.f64.f32({{.*}}) #[[ATTR1]] 274 275declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata) 276; CHECK: @llvm.experimental.constrained.sqrt.f64({{.*}}) #[[ATTR1]] 277 278declare double @llvm.experimental.constrained.powi.f64(double, i32, metadata, metadata) 279; CHECK: @llvm.experimental.constrained.powi.f64({{.*}}) #[[ATTR1]] 280 281declare double @llvm.experimental.constrained.sin.f64(double, metadata, metadata) 282; CHECK: @llvm.experimental.constrained.sin.f64({{.*}}) #[[ATTR1]] 283 284declare double @llvm.experimental.constrained.cos.f64(double, metadata, metadata) 285; CHECK: @llvm.experimental.constrained.cos.f64({{.*}}) #[[ATTR1]] 286 287declare double @llvm.experimental.constrained.tan.f64(double, metadata, metadata) 288; CHECK: @llvm.experimental.constrained.tan.f64({{.*}}) #[[ATTR1]] 289 290declare double @llvm.experimental.constrained.asin.f64(double, metadata, metadata) 291; CHECK: @llvm.experimental.constrained.asin.f64({{.*}}) #[[ATTR1]] 292 293declare double @llvm.experimental.constrained.acos.f64(double, metadata, metadata) 294; CHECK: @llvm.experimental.constrained.acos.f64({{.*}}) #[[ATTR1]] 295 296declare double @llvm.experimental.constrained.atan.f64(double, metadata, metadata) 297; CHECK: @llvm.experimental.constrained.atan.f64({{.*}}) #[[ATTR1]] 298 299declare double @llvm.experimental.constrained.atan2.f64(double, double, metadata, metadata) 300; CHECK: @llvm.experimental.constrained.atan2.f64({{.*}}) #[[ATTR1]] 301 302declare double @llvm.experimental.constrained.sinh.f64(double, metadata, metadata) 303; CHECK: @llvm.experimental.constrained.sinh.f64({{.*}}) #[[ATTR1]] 304 305declare double @llvm.experimental.constrained.cosh.f64(double, metadata, metadata) 306; CHECK: @llvm.experimental.constrained.cosh.f64({{.*}}) #[[ATTR1]] 307 308declare double @llvm.experimental.constrained.tanh.f64(double, metadata, metadata) 309; CHECK: @llvm.experimental.constrained.tanh.f64({{.*}}) #[[ATTR1]] 310 311declare double @llvm.experimental.constrained.pow.f64(double, double, metadata, metadata) 312; CHECK: @llvm.experimental.constrained.pow.f64({{.*}}) #[[ATTR1]] 313 314declare double @llvm.experimental.constrained.log.f64(double, metadata, metadata) 315; CHECK: @llvm.experimental.constrained.log.f64({{.*}}) #[[ATTR1]] 316 317declare double @llvm.experimental.constrained.log10.f64(double, metadata, metadata) 318; CHECK: @llvm.experimental.constrained.log10.f64({{.*}}) #[[ATTR1]] 319 320declare double @llvm.experimental.constrained.log2.f64(double, metadata, metadata) 321; CHECK: @llvm.experimental.constrained.log2.f64({{.*}}) #[[ATTR1]] 322 323declare double @llvm.experimental.constrained.exp.f64(double, metadata, metadata) 324; CHECK: @llvm.experimental.constrained.exp.f64({{.*}}) #[[ATTR1]] 325 326declare double @llvm.experimental.constrained.exp2.f64(double, metadata, metadata) 327; CHECK: @llvm.experimental.constrained.exp2.f64({{.*}}) #[[ATTR1]] 328 329declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata) 330; CHECK: @llvm.experimental.constrained.rint.f64({{.*}}) #[[ATTR1]] 331 332declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata) 333; CHECK: @llvm.experimental.constrained.nearbyint.f64({{.*}}) #[[ATTR1]] 334 335declare i32 @llvm.experimental.constrained.lrint.i32.f64(double, metadata, metadata) 336; CHECK: @llvm.experimental.constrained.lrint.i32.f64({{.*}}) #[[ATTR1]] 337 338declare i64 @llvm.experimental.constrained.llrint.i64.f64(double, metadata, metadata) 339; CHECK: @llvm.experimental.constrained.llrint.i64.f64({{.*}}) #[[ATTR1]] 340 341declare double @llvm.experimental.constrained.maxnum.f64(double, double, metadata) 342; CHECK: @llvm.experimental.constrained.maxnum.f64({{.*}}) #[[ATTR1]] 343 344declare double @llvm.experimental.constrained.minnum.f64(double, double, metadata) 345; CHECK: @llvm.experimental.constrained.minnum.f64({{.*}}) #[[ATTR1]] 346 347declare double @llvm.experimental.constrained.maximum.f64(double, double, metadata) 348; CHECK: @llvm.experimental.constrained.maximum.f64({{.*}}) #[[ATTR1]] 349 350declare double @llvm.experimental.constrained.minimum.f64(double, double, metadata) 351; CHECK: @llvm.experimental.constrained.minimum.f64({{.*}}) #[[ATTR1]] 352 353declare double @llvm.experimental.constrained.ceil.f64(double, metadata) 354; CHECK: @llvm.experimental.constrained.ceil.f64({{.*}}) #[[ATTR1]] 355 356declare double @llvm.experimental.constrained.floor.f64(double, metadata) 357; CHECK: @llvm.experimental.constrained.floor.f64({{.*}}) #[[ATTR1]] 358 359declare i32 @llvm.experimental.constrained.lround.i32.f64(double, metadata) 360; CHECK: @llvm.experimental.constrained.lround.i32.f64({{.*}}) #[[ATTR1]] 361 362declare i64 @llvm.experimental.constrained.llround.i64.f64(double, metadata) 363; CHECK: @llvm.experimental.constrained.llround.i64.f64({{.*}}) #[[ATTR1]] 364 365declare double @llvm.experimental.constrained.round.f64(double, metadata) 366; CHECK: @llvm.experimental.constrained.round.f64({{.*}}) #[[ATTR1]] 367 368declare double @llvm.experimental.constrained.roundeven.f64(double, metadata) 369; CHECK: @llvm.experimental.constrained.roundeven.f64({{.*}}) #[[ATTR1]] 370 371declare double @llvm.experimental.constrained.trunc.f64(double, metadata) 372; CHECK: @llvm.experimental.constrained.trunc.f64({{.*}}) #[[ATTR1]] 373 374declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) 375; CHECK: @llvm.experimental.constrained.fcmp.f64({{.*}}) #[[ATTR1]] 376 377declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata) 378; CHECK: @llvm.experimental.constrained.fcmps.f64({{.*}}) #[[ATTR1]] 379 380; CHECK: attributes #[[ATTR0]] = {{{.*}} strictfp {{.*}}} 381; CHECK: attributes #[[ATTR1]] = { {{.*}} strictfp {{.*}} } 382 383