1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT 3 4declare float @llvm.copysign.f32(float, float) 5declare float @llvm.fabs.f32(float) 6 7define float @ret_copysign(float %arg0, float %arg1) { 8; CHECK-LABEL: define float @ret_copysign 9; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1:[0-9]+]] { 10; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float [[ARG0]], float [[ARG1]]) #[[ATTR2:[0-9]+]] 11; CHECK-NEXT: ret float [[CALL]] 12; 13 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 14 ret float %call 15} 16 17define float @ret_copysign_fabs_rhs(float %arg0, float %arg1) { 18; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_copysign_fabs_rhs 19; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 20; CHECK-NEXT: [[FABS_ARG1:%.*]] = call float @llvm.fabs.f32(float [[ARG1]]) #[[ATTR2]] 21; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.copysign.f32(float [[ARG0]], float [[FABS_ARG1]]) #[[ATTR2]] 22; CHECK-NEXT: ret float [[CALL]] 23; 24 %fabs.arg1 = call float @llvm.fabs.f32(float %arg1) 25 %call = call float @llvm.copysign.f32(float %arg0, float %fabs.arg1) 26 ret float %call 27} 28 29define float @ret_copysign_nnan_lhs_fabs_rhs(float nofpclass(nan) %arg0, float %arg1) { 30; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_copysign_nnan_lhs_fabs_rhs 31; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 32; CHECK-NEXT: [[FABS_ARG1:%.*]] = call float @llvm.fabs.f32(float [[ARG1]]) #[[ATTR2]] 33; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.copysign.f32(float nofpclass(nan) [[ARG0]], float [[FABS_ARG1]]) #[[ATTR2]] 34; CHECK-NEXT: ret float [[CALL]] 35; 36 %fabs.arg1 = call float @llvm.fabs.f32(float %arg1) 37 %call = call float @llvm.copysign.f32(float %arg0, float %fabs.arg1) 38 ret float %call 39} 40 41 42define float @ret_copysign_lhs_fabs_nnan_rhs(float %arg0, float %arg1) { 43; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_copysign_lhs_fabs_nnan_rhs 44; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 45; CHECK-NEXT: [[FABS_ARG1:%.*]] = call nnan float @llvm.fabs.f32(float [[ARG1]]) #[[ATTR2]] 46; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.copysign.f32(float [[ARG0]], float [[FABS_ARG1]]) #[[ATTR2]] 47; CHECK-NEXT: ret float [[CALL]] 48; 49 %fabs.arg1 = call nnan float @llvm.fabs.f32(float %arg1) 50 %call = call float @llvm.copysign.f32(float %arg0, float %fabs.arg1) 51 ret float %call 52} 53 54 55define float @ret_copysign_noneg_lhs(float nofpclass(ninf nnorm nsub nzero) %arg0, float %arg1) { 56; CHECK-LABEL: define float @ret_copysign_noneg_lhs 57; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 58; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(ninf nzero nsub nnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 59; CHECK-NEXT: ret float [[CALL]] 60; 61 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 62 ret float %call 63} 64 65define float @ret_copysign_noneg_rhs(float %arg0, float nofpclass(ninf nnorm nsub nzero) %arg1) { 66; CHECK-LABEL: define float @ret_copysign_noneg_rhs 67; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR1]] { 68; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float [[ARG0]], float nofpclass(ninf nzero nsub nnorm) [[ARG1]]) #[[ATTR2]] 69; CHECK-NEXT: ret float [[CALL]] 70; 71 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 72 ret float %call 73} 74 75define float @ret_copysign_noneg_nonan_rhs(float %arg0, float nofpclass(ninf nnorm nsub nzero nan) %arg1) { 76; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_copysign_noneg_nonan_rhs 77; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR1]] { 78; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.copysign.f32(float [[ARG0]], float nofpclass(nan ninf nzero nsub nnorm) [[ARG1]]) #[[ATTR2]] 79; CHECK-NEXT: ret float [[CALL]] 80; 81 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 82 ret float %call 83} 84 85define float @ret_copysign_nopos_lhs(float nofpclass(pinf pnorm psub pzero) %arg0, float %arg1) { 86; CHECK-LABEL: define float @ret_copysign_nopos_lhs 87; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 88; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(pinf pzero psub pnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 89; CHECK-NEXT: ret float [[CALL]] 90; 91 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 92 ret float %call 93} 94 95define float @ret_copysign_nopos_rhs(float %arg0, float nofpclass(pinf pnorm psub pzero) %arg1) { 96; CHECK-LABEL: define float @ret_copysign_nopos_rhs 97; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(pinf pzero psub pnorm) [[ARG1:%.*]]) #[[ATTR1]] { 98; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float [[ARG0]], float nofpclass(pinf pzero psub pnorm) [[ARG1]]) #[[ATTR2]] 99; CHECK-NEXT: ret float [[CALL]] 100; 101 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 102 ret float %call 103} 104 105define float @ret_copysign_nonan_lhs(float nofpclass(nan) %arg0, float %arg1) { 106; CHECK-LABEL: define nofpclass(nan) float @ret_copysign_nonan_lhs 107; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 108; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.copysign.f32(float nofpclass(nan) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 109; CHECK-NEXT: ret float [[CALL]] 110; 111 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 112 ret float %call 113} 114 115define float @ret_copysign_nonan_rhs(float %arg0, float nofpclass(nan) %arg1) { 116; CHECK-LABEL: define float @ret_copysign_nonan_rhs 117; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR1]] { 118; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float [[ARG0]], float nofpclass(nan) [[ARG1]]) #[[ATTR2]] 119; CHECK-NEXT: ret float [[CALL]] 120; 121 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 122 ret float %call 123} 124 125define float @ret_copysign_noneg_nonan_lhs(float nofpclass(ninf nnorm nsub nzero nan) %arg0, float %arg1) { 126; CHECK-LABEL: define nofpclass(nan) float @ret_copysign_noneg_nonan_lhs 127; CHECK-SAME: (float nofpclass(nan ninf nzero nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 128; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.copysign.f32(float nofpclass(nan ninf nzero nsub nnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 129; CHECK-NEXT: ret float [[CALL]] 130; 131 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 132 ret float %call 133} 134 135define float @ret_copysign_nopos_nonan_lhs(float nofpclass(pinf pnorm psub pzero nan) %arg0, float %arg1) { 136; CHECK-LABEL: define nofpclass(nan) float @ret_copysign_nopos_nonan_lhs 137; CHECK-SAME: (float nofpclass(nan pinf pzero psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 138; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @llvm.copysign.f32(float nofpclass(nan pinf pzero psub pnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 139; CHECK-NEXT: ret float [[CALL]] 140; 141 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 142 ret float %call 143} 144 145define float @ret_copysign_mixed_lhs0(float nofpclass(ninf pnorm nsub nzero) %arg0, float %arg1) { 146; CHECK-LABEL: define float @ret_copysign_mixed_lhs0 147; CHECK-SAME: (float nofpclass(ninf nzero nsub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 148; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(ninf nzero nsub pnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 149; CHECK-NEXT: ret float [[CALL]] 150; 151 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 152 ret float %call 153} 154 155define float @ret_copysign_mixed_lhs1(float nofpclass(pinf nnorm psub pzero) %arg0, float %arg1) { 156; CHECK-LABEL: define float @ret_copysign_mixed_lhs1 157; CHECK-SAME: (float nofpclass(pinf pzero psub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 158; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(pinf pzero psub nnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 159; CHECK-NEXT: ret float [[CALL]] 160; 161 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 162 ret float %call 163} 164 165define float @ret_copysign_mixed_lhs2(float nofpclass(ninf pnorm psub nzero qnan) %arg0, float %arg1) { 166; CHECK-LABEL: define nofpclass(qnan) float @ret_copysign_mixed_lhs2 167; CHECK-SAME: (float nofpclass(qnan ninf nzero psub pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 168; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(qnan) float @llvm.copysign.f32(float nofpclass(qnan ninf nzero psub pnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 169; CHECK-NEXT: ret float [[CALL]] 170; 171 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 172 ret float %call 173} 174 175define float @ret_copysign_noninf_lhs(float nofpclass(ninf) %arg0, float %arg1) { 176; CHECK-LABEL: define float @ret_copysign_noninf_lhs 177; CHECK-SAME: (float nofpclass(ninf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 178; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(ninf) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 179; CHECK-NEXT: ret float [[CALL]] 180; 181 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 182 ret float %call 183} 184 185define float @ret_copysign_nopinf_lhs(float nofpclass(pinf) %arg0, float %arg1) { 186; CHECK-LABEL: define float @ret_copysign_nopinf_lhs 187; CHECK-SAME: (float nofpclass(pinf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 188; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(pinf) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 189; CHECK-NEXT: ret float [[CALL]] 190; 191 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 192 ret float %call 193} 194 195define float @ret_copysign_noinf_lhs(float nofpclass(inf) %arg0, float %arg1) { 196; CHECK-LABEL: define nofpclass(inf) float @ret_copysign_noinf_lhs 197; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 198; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(inf) float @llvm.copysign.f32(float nofpclass(inf) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 199; CHECK-NEXT: ret float [[CALL]] 200; 201 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 202 ret float %call 203} 204 205define float @ret_copysign_nonzero_lhs(float nofpclass(nzero) %arg0, float %arg1) { 206; CHECK-LABEL: define float @ret_copysign_nonzero_lhs 207; CHECK-SAME: (float nofpclass(nzero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 208; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(nzero) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 209; CHECK-NEXT: ret float [[CALL]] 210; 211 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 212 ret float %call 213} 214 215define float @ret_copysign_nopzero_lhs(float nofpclass(pzero) %arg0, float %arg1) { 216; CHECK-LABEL: define float @ret_copysign_nopzero_lhs 217; CHECK-SAME: (float nofpclass(pzero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 218; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(pzero) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 219; CHECK-NEXT: ret float [[CALL]] 220; 221 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 222 ret float %call 223} 224 225define float @ret_copysign_nozero_lhs(float nofpclass(zero) %arg0, float %arg1) { 226; CHECK-LABEL: define nofpclass(zero) float @ret_copysign_nozero_lhs 227; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 228; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(zero) float @llvm.copysign.f32(float nofpclass(zero) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 229; CHECK-NEXT: ret float [[CALL]] 230; 231 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 232 ret float %call 233} 234 235define float @ret_copysign_nonsub_lhs(float nofpclass(nsub) %arg0, float %arg1) { 236; CHECK-LABEL: define float @ret_copysign_nonsub_lhs 237; CHECK-SAME: (float nofpclass(nsub) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 238; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(nsub) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 239; CHECK-NEXT: ret float [[CALL]] 240; 241 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 242 ret float %call 243} 244 245define float @ret_copysign_nopsub_lhs(float nofpclass(psub) %arg0, float %arg1) { 246; CHECK-LABEL: define float @ret_copysign_nopsub_lhs 247; CHECK-SAME: (float nofpclass(psub) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 248; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(psub) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 249; CHECK-NEXT: ret float [[CALL]] 250; 251 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 252 ret float %call 253} 254 255define float @ret_copysign_nosub_lhs(float nofpclass(sub) %arg0, float %arg1) { 256; CHECK-LABEL: define nofpclass(sub) float @ret_copysign_nosub_lhs 257; CHECK-SAME: (float nofpclass(sub) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 258; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(sub) float @llvm.copysign.f32(float nofpclass(sub) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 259; CHECK-NEXT: ret float [[CALL]] 260; 261 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 262 ret float %call 263} 264 265define float @ret_copysign_nonnorm_lhs(float nofpclass(nnorm) %arg0, float %arg1) { 266; CHECK-LABEL: define float @ret_copysign_nonnorm_lhs 267; CHECK-SAME: (float nofpclass(nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 268; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(nnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 269; CHECK-NEXT: ret float [[CALL]] 270; 271 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 272 ret float %call 273} 274 275define float @ret_copysign_nopnorm_lhs(float nofpclass(pnorm) %arg0, float %arg1) { 276; CHECK-LABEL: define float @ret_copysign_nopnorm_lhs 277; CHECK-SAME: (float nofpclass(pnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 278; CHECK-NEXT: [[CALL:%.*]] = call float @llvm.copysign.f32(float nofpclass(pnorm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 279; CHECK-NEXT: ret float [[CALL]] 280; 281 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 282 ret float %call 283} 284 285define float @ret_copysign_nonorm_lhs(float nofpclass(norm) %arg0, float %arg1) { 286; CHECK-LABEL: define nofpclass(norm) float @ret_copysign_nonorm_lhs 287; CHECK-SAME: (float nofpclass(norm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR1]] { 288; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(norm) float @llvm.copysign.f32(float nofpclass(norm) [[ARG0]], float [[ARG1]]) #[[ATTR2]] 289; CHECK-NEXT: ret float [[CALL]] 290; 291 %call = call float @llvm.copysign.f32(float %arg0, float %arg1) 292 ret float %call 293} 294;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 295; TUNIT: {{.*}} 296