1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=reassociate,gvn -S < %s | FileCheck %s 3 4; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y) 5define double @test1(double %x, double %y) { 6; CHECK-LABEL: @test1( 7; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 8; CHECK-NEXT: [[ADD:%.*]] = fadd double [[X:%.*]], [[MUL]] 9; CHECK-NEXT: [[ADD21:%.*]] = fsub double [[X]], [[MUL]] 10; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[ADD]], [[ADD21]] 11; CHECK-NEXT: ret double [[MUL3]] 12; 13 %mul = fmul double 1.234000e-01, %y 14 %add = fadd double %mul, %x 15 %mul1 = fmul double -1.234000e-01, %y 16 %add2 = fadd double %mul1, %x 17 %mul3 = fmul double %add, %add2 18 ret double %mul3 19} 20 21; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y) 22define double @test2(double %x, double %y) { 23; CHECK-LABEL: @test2( 24; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 25; CHECK-NEXT: [[ADD1:%.*]] = fsub double [[X:%.*]], [[MUL]] 26; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[ADD1]], [[ADD1]] 27; CHECK-NEXT: ret double [[MUL3]] 28; 29 %mul = fmul double %y, -1.234000e-01 30 %add = fadd double %mul, %x 31 %mul1 = fmul double %y, -1.234000e-01 32 %add2 = fadd double %mul1, %x 33 %mul3 = fmul double %add, %add2 34 ret double %mul3 35} 36 37; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y) 38define double @test3(double %x, double %y) { 39; CHECK-LABEL: @test3( 40; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 41; CHECK-NEXT: [[ADD:%.*]] = fadd double [[X:%.*]], [[MUL]] 42; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[ADD]], [[ADD]] 43; CHECK-NEXT: ret double [[MUL3]] 44; 45 %mul = fmul double %y, 1.234000e-01 46 %add = fadd double %mul, %x 47 %mul1 = fmul double %y, -1.234000e-01 48 %add2 = fsub double %x, %mul1 49 %mul3 = fmul double %add, %add2 50 ret double %mul3 51} 52 53; Canonicalize (x - -0.1234 * y) 54define double @test5(double %x, double %y) { 55; CHECK-LABEL: @test5( 56; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 57; CHECK-NEXT: [[SUB1:%.*]] = fadd double [[X:%.*]], [[MUL]] 58; CHECK-NEXT: ret double [[SUB1]] 59; 60 %mul = fmul double -1.234000e-01, %y 61 %sub = fsub double %x, %mul 62 ret double %sub 63} 64 65; Don't modify (-0.1234 * y - x) 66define double @test6(double %x, double %y) { 67; CHECK-LABEL: @test6( 68; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], -1.234000e-01 69; CHECK-NEXT: [[SUB:%.*]] = fsub double [[MUL]], [[X:%.*]] 70; CHECK-NEXT: ret double [[SUB]] 71; 72 %mul = fmul double -1.234000e-01, %y 73 %sub = fsub double %mul, %x 74 ret double %sub 75} 76 77; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y) 78define double @test7(double %x, double %y) { 79; CHECK-LABEL: @test7( 80; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 81; CHECK-NEXT: [[ADD1:%.*]] = fsub double [[X:%.*]], [[MUL]] 82; CHECK-NEXT: ret double [[ADD1]] 83; 84 %mul = fmul double -1.234000e-01, %y 85 %add = fadd double %mul, %x 86 ret double %add 87} 88 89; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y) 90define double @test8(double %x, double %y) { 91; CHECK-LABEL: @test8( 92; CHECK-NEXT: [[MUL:%.*]] = fmul double [[Y:%.*]], 1.234000e-01 93; CHECK-NEXT: [[ADD1:%.*]] = fsub double [[X:%.*]], [[MUL]] 94; CHECK-NEXT: ret double [[ADD1]] 95; 96 %mul = fmul double %y, -1.234000e-01 97 %add = fadd double %mul, %x 98 ret double %add 99} 100 101; Canonicalize (x - -0.1234 / y) 102define double @test9(double %x, double %y) { 103; CHECK-LABEL: @test9( 104; CHECK-NEXT: [[DIV:%.*]] = fdiv double 1.234000e-01, [[Y:%.*]] 105; CHECK-NEXT: [[SUB1:%.*]] = fadd double [[X:%.*]], [[DIV]] 106; CHECK-NEXT: ret double [[SUB1]] 107; 108 %div = fdiv double -1.234000e-01, %y 109 %sub = fsub double %x, %div 110 ret double %sub 111} 112 113; Don't modify (-0.1234 / y - x) 114define double @test10(double %x, double %y) { 115; CHECK-LABEL: @test10( 116; CHECK-NEXT: [[DIV:%.*]] = fdiv double -1.234000e-01, [[Y:%.*]] 117; CHECK-NEXT: [[SUB:%.*]] = fsub double [[DIV]], [[X:%.*]] 118; CHECK-NEXT: ret double [[SUB]] 119; 120 %div = fdiv double -1.234000e-01, %y 121 %sub = fsub double %div, %x 122 ret double %sub 123} 124 125; Canonicalize (-0.1234 / y + x) -> (x - 0.1234 / y) 126define double @test11(double %x, double %y) { 127; CHECK-LABEL: @test11( 128; CHECK-NEXT: [[DIV:%.*]] = fdiv double 1.234000e-01, [[Y:%.*]] 129; CHECK-NEXT: [[ADD1:%.*]] = fsub double [[X:%.*]], [[DIV]] 130; CHECK-NEXT: ret double [[ADD1]] 131; 132 %div = fdiv double -1.234000e-01, %y 133 %add = fadd double %div, %x 134 ret double %add 135} 136 137; Canonicalize (y / -0.1234 + x) -> (x - y / 0.1234) 138define double @test12(double %x, double %y) { 139; CHECK-LABEL: @test12( 140; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[Y:%.*]], 1.234000e-01 141; CHECK-NEXT: [[ADD1:%.*]] = fsub double [[X:%.*]], [[DIV]] 142; CHECK-NEXT: ret double [[ADD1]] 143; 144 %div = fdiv double %y, -1.234000e-01 145 %add = fadd double %div, %x 146 ret double %add 147} 148 149; Don't create an NSW violation 150define i4 @test13(i4 %x) { 151; CHECK-LABEL: @test13( 152; CHECK-NEXT: [[MUL:%.*]] = mul nsw i4 [[X:%.*]], -2 153; CHECK-NEXT: [[ADD:%.*]] = add i4 [[MUL]], 3 154; CHECK-NEXT: ret i4 [[ADD]] 155; 156 %mul = mul nsw i4 %x, -2 157 %add = add i4 %mul, 3 158 ret i4 %add 159} 160 161; This tests used to cause an infinite loop where we would loop between 162; canonicalizing the negated constant (i.e., (X + Y*-5.0) -> (X - Y*5.0)) and 163; breaking up a subtract (i.e., (X - Y*5.0) -> X + (0 - Y*5.0)). To break the 164; cycle, we don't canonicalize the negative constant if we're going to later 165; break up the subtract. 166; 167; Check to make sure we don't canonicalize 168; (%pow2*-5.0 + %sub) -> (%sub - %pow2*5.0) 169; as we would later break up this subtract causing a cycle. 170 171define double @pr34078(double %A) { 172; CHECK-LABEL: @pr34078( 173; CHECK-NEXT: [[SUB:%.*]] = fsub fast double 1.000000e+00, [[A:%.*]] 174; CHECK-NEXT: [[POW2:%.*]] = fmul double [[A]], [[A]] 175; CHECK-NEXT: [[MUL5_NEG:%.*]] = fmul fast double [[POW2]], -5.000000e-01 176; CHECK-NEXT: [[SUB1:%.*]] = fadd fast double [[MUL5_NEG]], [[SUB]] 177; CHECK-NEXT: [[FACTOR:%.*]] = fmul fast double [[SUB1]], 2.000000e+00 178; CHECK-NEXT: ret double [[FACTOR]] 179; 180 %sub = fsub fast double 1.000000e+00, %A 181 %pow2 = fmul double %A, %A 182 %mul5 = fmul fast double %pow2, 5.000000e-01 183 %sub1 = fsub fast double %sub, %mul5 184 %add = fadd fast double %sub1, %sub1 185 ret double %add 186} 187 188define double @fadd_fmul_neg_const1(double %a, double %b, double %c) { 189; CHECK-LABEL: @fadd_fmul_neg_const1( 190; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[B:%.*]], 3.000000e+00 191; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[C:%.*]] 192; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[A:%.*]], [[MUL1]] 193; CHECK-NEXT: ret double [[TMP1]] 194; 195 %mul0 = fmul double %b, -3.0 196 %mul1 = fmul double %mul0, %c 197 %add = fadd double %mul1, %a 198 ret double %add 199} 200 201define double @fadd_fmul_neg_const2(double %a, double %b, double %c) { 202; CHECK-LABEL: @fadd_fmul_neg_const2( 203; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 204; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[B:%.*]] 205; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[MUL1]], 4.000000e+00 206; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], [[MUL2]] 207; CHECK-NEXT: ret double [[ADD]] 208; 209 %mul0 = fmul double %a, -3.0 210 %mul1 = fmul double %mul0, %b 211 %mul2 = fmul double %mul1, -4.0 212 %add = fadd double %mul2, %a 213 ret double %add 214} 215 216define double @fadd_fmul_neg_const3(double %a, double %b, double %c) { 217; CHECK-LABEL: @fadd_fmul_neg_const3( 218; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 219; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[B:%.*]] 220; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[MUL1]], 4.000000e+00 221; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[MUL2]], 5.000000e+00 222; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[C:%.*]], [[MUL3]] 223; CHECK-NEXT: ret double [[TMP1]] 224; 225 %mul0 = fmul double %a, -3.0 226 %mul1 = fmul double %mul0, %b 227 %mul2 = fmul double %mul1, -4.0 228 %mul3 = fmul double %mul2, -5.0 229 %add = fadd double %mul3, %c 230 ret double %add 231} 232 233define double @fsub_fmul_neg_const1(double %a, double %b, double %c) { 234; CHECK-LABEL: @fsub_fmul_neg_const1( 235; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[B:%.*]], 3.000000e+00 236; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[C:%.*]] 237; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A:%.*]], [[MUL1]] 238; CHECK-NEXT: ret double [[TMP1]] 239; 240 %mul0 = fmul double %b, -3.0 241 %mul1 = fmul double %mul0, %c 242 %sub = fsub double %a, %mul1 243 ret double %sub 244} 245 246define double @fsub_fmul_neg_const2(double %a, double %b, double %c) { 247; CHECK-LABEL: @fsub_fmul_neg_const2( 248; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 249; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[B:%.*]] 250; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[MUL1]], 4.000000e+00 251; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A]], [[MUL2]] 252; CHECK-NEXT: ret double [[TMP1]] 253; 254 %mul0 = fmul double %a, -3.0 255 %mul1 = fmul double %mul0, %b 256 %mul2 = fmul double %mul1, 4.0 257 %sub = fsub double %a, %mul2 258 ret double %sub 259} 260 261define double @fsub_fmul_neg_const3(double %a, double %b, double %c) { 262; CHECK-LABEL: @fsub_fmul_neg_const3( 263; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 264; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[MUL0]], [[B:%.*]] 265; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[MUL1]], 4.000000e+00 266; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[MUL2]], 5.000000e+00 267; CHECK-NEXT: [[SUB:%.*]] = fsub double [[C:%.*]], [[MUL3]] 268; CHECK-NEXT: ret double [[SUB]] 269; 270 %mul0 = fmul double %a, 3.0 271 %mul1 = fmul double %mul0, %b 272 %mul2 = fmul double %mul1, -4.0 273 %mul3 = fmul double %mul2, -5.0 274 %sub = fsub double %c, %mul3 275 ret double %sub 276} 277 278define double @fadd_fdiv_neg_const1(double %a, double %b, double %c) { 279; CHECK-LABEL: @fadd_fdiv_neg_const1( 280; CHECK-NEXT: [[DIV0:%.*]] = fdiv double [[B:%.*]], 3.000000e+00 281; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[C:%.*]] 282; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[A:%.*]], [[DIV1]] 283; CHECK-NEXT: ret double [[TMP1]] 284; 285 %div0 = fdiv double %b, -3.0 286 %div1 = fdiv double %div0, %c 287 %add = fadd double %div1, %a 288 ret double %add 289} 290 291define double @fadd_fdiv_neg_const2(double %a, double %b, double %c) { 292; CHECK-LABEL: @fadd_fdiv_neg_const2( 293; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 294; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[B:%.*]] 295; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[DIV1]], 7.000000e+00 296; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], [[DIV2]] 297; CHECK-NEXT: ret double [[ADD]] 298; 299 %div0 = fdiv double -3.0, %a 300 %div1 = fdiv double %div0, %b 301 %div2 = fdiv double %div1, -7.0 302 %add = fadd double %div2, %a 303 ret double %add 304} 305 306define double @fadd_fdiv_neg_const3(double %a, double %b, double %c) { 307; CHECK-LABEL: @fadd_fdiv_neg_const3( 308; CHECK-NEXT: [[DIV0:%.*]] = fdiv double [[A:%.*]], 3.000000e+00 309; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[B:%.*]] 310; CHECK-NEXT: [[DIV2:%.*]] = fdiv double 4.000000e+00, [[DIV1]] 311; CHECK-NEXT: [[DIV3:%.*]] = fdiv double [[DIV2]], 5.000000e+00 312; CHECK-NEXT: [[ADD:%.*]] = fadd double [[C:%.*]], [[DIV3]] 313; CHECK-NEXT: ret double [[ADD]] 314; 315 %div0 = fdiv double %a, -3.0 316 %div1 = fdiv double %div0, %b 317 %div2 = fdiv double -4.0, %div1 318 %div3 = fdiv double %div2, 5.0 319 %add = fadd double %div3, %c 320 ret double %add 321} 322 323define double @fsub_fdiv_neg_const1(double %a, double %b, double %c) { 324; CHECK-LABEL: @fsub_fdiv_neg_const1( 325; CHECK-NEXT: [[DIV0:%.*]] = fdiv double [[B:%.*]], 3.000000e+00 326; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[C:%.*]] 327; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A:%.*]], [[DIV1]] 328; CHECK-NEXT: ret double [[TMP1]] 329; 330 %div0 = fdiv double %b, -3.0 331 %div1 = fdiv double %div0, %c 332 %sub = fsub double %a, %div1 333 ret double %sub 334} 335 336define double @fsub_fdiv_neg_const2(double %a, double %b, double %c) { 337; CHECK-LABEL: @fsub_fdiv_neg_const2( 338; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 339; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[B:%.*]] 340; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[DIV1]], 7.000000e+00 341; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A]], [[DIV2]] 342; CHECK-NEXT: ret double [[TMP1]] 343; 344 %div0 = fdiv double -3.0, %a 345 %div1 = fdiv double %div0, %b 346 %div2 = fdiv double %div1, 7.0 347 %sub = fsub double %a, %div2 348 ret double %sub 349} 350 351define double @fsub_fdiv_neg_const3(double %a, double %b, double %c) { 352; CHECK-LABEL: @fsub_fdiv_neg_const3( 353; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 354; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[DIV0]], [[B:%.*]] 355; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[DIV1]], 7.000000e+00 356; CHECK-NEXT: [[DIV3:%.*]] = fdiv double 5.000000e+00, [[DIV2]] 357; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[C:%.*]], [[DIV3]] 358; CHECK-NEXT: ret double [[TMP1]] 359; 360 %div0 = fdiv double -3.0, %a 361 %div1 = fdiv double %div0, %b 362 %div2 = fdiv double %div1, -7.0 363 %div3 = fdiv double -5.0, %div2 364 %sub = fsub double %c, %div3 365 ret double %sub 366} 367 368define double @fadd_mix_neg_const1(double %a, double %b, double %c) { 369; CHECK-LABEL: @fadd_mix_neg_const1( 370; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[B:%.*]], 3.000000e+00 371; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[MUL0]], [[C:%.*]] 372; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[A:%.*]], [[DIV1]] 373; CHECK-NEXT: ret double [[TMP1]] 374; 375 %mul0 = fmul double %b, -3.0 376 %div1 = fdiv double %mul0, %c 377 %add = fadd double %div1, %a 378 ret double %add 379} 380 381define double @fadd_mix_neg_const2(double %a, double %b, double %c) { 382; CHECK-LABEL: @fadd_mix_neg_const2( 383; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 384; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[DIV0]], [[B:%.*]] 385; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[MUL1]], 5.000000e+00 386; CHECK-NEXT: [[ADD:%.*]] = fadd double [[A]], [[DIV2]] 387; CHECK-NEXT: ret double [[ADD]] 388; 389 %div0 = fdiv double -3.0, %a 390 %mul1 = fmul double %div0, %b 391 %div2 = fdiv double %mul1, -5.0 392 %add = fadd double %div2, %a 393 ret double %add 394} 395 396define double @fadd_mix_neg_const3(double %a, double %b, double %c) { 397; CHECK-LABEL: @fadd_mix_neg_const3( 398; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 399; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[MUL0]], [[B:%.*]] 400; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[DIV1]], 4.000000e+00 401; CHECK-NEXT: [[DIV3:%.*]] = fdiv double [[MUL2]], 5.000000e+00 402; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[C:%.*]], [[DIV3]] 403; CHECK-NEXT: ret double [[TMP1]] 404; 405 %mul0 = fmul double %a, -3.0 406 %div1 = fdiv double %mul0, %b 407 %mul2 = fmul double -4.0, %div1 408 %div3 = fdiv double %mul2, -5.0 409 %add = fadd double %div3, %c 410 ret double %add 411} 412 413define double @fsub_mix_neg_const1(double %a, double %b, double %c) { 414; CHECK-LABEL: @fsub_mix_neg_const1( 415; CHECK-NEXT: [[DIV0:%.*]] = fdiv double [[B:%.*]], 3.000000e+00 416; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[DIV0]], [[C:%.*]] 417; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[A:%.*]], [[MUL1]] 418; CHECK-NEXT: ret double [[TMP1]] 419; 420 %div0 = fdiv double %b, -3.0 421 %mul1 = fmul double %div0, %c 422 %sub = fsub double %a, %mul1 423 ret double %sub 424} 425define double @fsub_mix_neg_const2(double %a, double %b, double %c) { 426; CHECK-LABEL: @fsub_mix_neg_const2( 427; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], 3.000000e+00 428; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[MUL0]], [[B:%.*]] 429; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[DIV1]], 5.000000e+00 430; CHECK-NEXT: [[SUB:%.*]] = fsub double [[A]], [[MUL2]] 431; CHECK-NEXT: ret double [[SUB]] 432; 433 %mul0 = fmul double -3.0, %a 434 %div1 = fdiv double %mul0, %b 435 %mul2 = fmul double %div1, -5.0 436 %sub = fsub double %a, %mul2 437 ret double %sub 438} 439 440define double @fsub_mix_neg_const3(double %a, double %b, double %c) { 441; CHECK-LABEL: @fsub_mix_neg_const3( 442; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 443; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[DIV0]], [[B:%.*]] 444; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[MUL1]], 7.000000e+00 445; CHECK-NEXT: [[MUL3:%.*]] = fmul double [[DIV2]], 5.000000e+00 446; CHECK-NEXT: [[TMP1:%.*]] = fadd double [[C:%.*]], [[MUL3]] 447; CHECK-NEXT: ret double [[TMP1]] 448; 449 %div0 = fdiv double -3.0, %a 450 %mul1 = fmul double %div0, %b 451 %div2 = fdiv double %mul1, -7.0 452 %mul3 = fmul double -5.0, %div2 453 %sub = fsub double %c, %mul3 454 ret double %sub 455} 456 457define double @fadd_both_ops_mix_neg_const1(double %a, double %b, double %c) { 458; CHECK-LABEL: @fadd_both_ops_mix_neg_const1( 459; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[B:%.*]], -3.000000e+00 460; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[MUL0]], [[C:%.*]] 461; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[A:%.*]], 4.000000e+00 462; CHECK-NEXT: [[DIV3:%.*]] = fdiv double [[MUL2]], [[C]] 463; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[DIV1]], [[DIV3]] 464; CHECK-NEXT: ret double [[TMP1]] 465; 466 %mul0 = fmul double %b, -3.0 467 %div1 = fdiv double %mul0, %c 468 %mul2 = fmul double %a, -4.0 469 %div3 = fdiv double %mul2, %c 470 %add = fadd double %div1, %div3 471 ret double %add 472} 473 474define double @fadd_both_ops_mix_neg_const2(double %a, double %b, double %c) { 475; CHECK-LABEL: @fadd_both_ops_mix_neg_const2( 476; CHECK-NEXT: [[DIV0:%.*]] = fdiv double 3.000000e+00, [[A:%.*]] 477; CHECK-NEXT: [[MUL1:%.*]] = fmul double [[DIV0]], [[B:%.*]] 478; CHECK-NEXT: [[DIV2:%.*]] = fdiv double [[MUL1]], 7.000000e+00 479; CHECK-NEXT: [[DIV3:%.*]] = fdiv double 5.000000e+00, [[C:%.*]] 480; CHECK-NEXT: [[MUL4:%.*]] = fmul double [[B]], [[DIV3]] 481; CHECK-NEXT: [[DIV5:%.*]] = fdiv double [[MUL4]], 6.000000e+00 482; CHECK-NEXT: [[ADD:%.*]] = fadd double [[DIV2]], [[DIV5]] 483; CHECK-NEXT: ret double [[ADD]] 484; 485 %div0 = fdiv double -3.0, %a 486 %mul1 = fmul double %div0, %b 487 %div2 = fdiv double %mul1, -7.0 488 %div3 = fdiv double -5.0, %c 489 %mul4 = fmul double %div3, %b 490 %div5 = fdiv double %mul4, -6.0 491 %add = fadd double %div2, %div5 492 ret double %add 493} 494 495define double @fadd_both_opsmix_neg_const3(double %a, double %b, double %c) { 496; CHECK-LABEL: @fadd_both_opsmix_neg_const3( 497; CHECK-NEXT: [[MUL0:%.*]] = fmul double [[A:%.*]], -3.000000e+00 498; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[MUL0]], [[B:%.*]] 499; CHECK-NEXT: [[MUL2:%.*]] = fmul double [[DIV1]], -4.000000e+00 500; CHECK-NEXT: [[DIV3:%.*]] = fdiv double [[MUL2]], -5.000000e+00 501; CHECK-NEXT: [[MUL4:%.*]] = fmul double [[C:%.*]], 6.000000e+00 502; CHECK-NEXT: [[DIV5:%.*]] = fdiv double [[MUL4]], [[B]] 503; CHECK-NEXT: [[MUL6:%.*]] = fmul double [[DIV5]], 7.000000e+00 504; CHECK-NEXT: [[MUL7:%.*]] = fdiv double [[MUL6]], 9.000000e+00 505; CHECK-NEXT: [[TMP1:%.*]] = fsub double [[DIV3]], [[MUL7]] 506; CHECK-NEXT: ret double [[TMP1]] 507; 508 %mul0 = fmul double %a, -3.0 509 %div1 = fdiv double %mul0, %b 510 %mul2 = fmul double -4.0, %div1 511 %div3 = fdiv double %mul2, -5.0 512 %mul4 = fmul double %c, -6.0 513 %div5 = fdiv double %mul4, %b 514 %mul6 = fmul double -7.0, %div5 515 %mul7 = fdiv double %mul6, -9.0 516 %add = fadd double %div3, %mul7 517 ret double %add 518} 519