1*9880d681SAndroid Build Coastguard Worker; RUN: opt -reassociate -gvn -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y) 4*9880d681SAndroid Build Coastguard Workerdefine double @test1(double %x, double %y) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd double %x, %mul 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %mul 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}} 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %mul 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker %mul = fmul double 1.234000e-01, %y 13*9880d681SAndroid Build Coastguard Worker %add = fadd double %mul, %x 14*9880d681SAndroid Build Coastguard Worker %mul1 = fmul double -1.234000e-01, %y 15*9880d681SAndroid Build Coastguard Worker %add2 = fadd double %mul1, %x 16*9880d681SAndroid Build Coastguard Worker %mul3 = fmul double %add, %add2 17*9880d681SAndroid Build Coastguard Worker ret double %mul3 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y) 21*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %x, double %y) { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %mul 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}} 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %mul 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker %mul = fmul double %y, -1.234000e-01 29*9880d681SAndroid Build Coastguard Worker %add = fadd double %mul, %x 30*9880d681SAndroid Build Coastguard Worker %mul1 = fmul double %y, -1.234000e-01 31*9880d681SAndroid Build Coastguard Worker %add2 = fadd double %mul1, %x 32*9880d681SAndroid Build Coastguard Worker %mul3 = fmul double %add, %add2 33*9880d681SAndroid Build Coastguard Worker ret double %mul3 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y) 37*9880d681SAndroid Build Coastguard Workerdefine double @test3(double %x, double %y) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd double %x, %mul 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}} 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker %mul = fmul double %y, 1.234000e-01 45*9880d681SAndroid Build Coastguard Worker %add = fadd double %mul, %x 46*9880d681SAndroid Build Coastguard Worker %mul1 = fmul double %y, -1.234000e-01 47*9880d681SAndroid Build Coastguard Worker %add2 = fsub double %x, %mul1 48*9880d681SAndroid Build Coastguard Worker %mul3 = fmul double %add, %add2 49*9880d681SAndroid Build Coastguard Worker ret double %mul3 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; Canonicalize (x - -0.1234 * y) 53*9880d681SAndroid Build Coastguard Workerdefine double @test5(double %x, double %y) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd double %x, %mul 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker %mul = fmul double -1.234000e-01, %y 60*9880d681SAndroid Build Coastguard Worker %sub = fsub double %x, %mul 61*9880d681SAndroid Build Coastguard Worker ret double %sub 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; Don't modify (-0.1234 * y - x) 65*9880d681SAndroid Build Coastguard Workerdefine double @test6(double %x, double %y) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, -1.234000e-01 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %mul, %x 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %sub 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker %mul = fmul double -1.234000e-01, %y 72*9880d681SAndroid Build Coastguard Worker %sub = fsub double %mul, %x 73*9880d681SAndroid Build Coastguard Worker ret double %sub 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y) 77*9880d681SAndroid Build Coastguard Workerdefine double @test7(double %x, double %y) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %mul 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %add 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker %mul = fmul double -1.234000e-01, %y 84*9880d681SAndroid Build Coastguard Worker %add = fadd double %mul, %x 85*9880d681SAndroid Build Coastguard Worker ret double %add 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y) 89*9880d681SAndroid Build Coastguard Workerdefine double @test8(double %x, double %y) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul double %y, 1.234000e-01 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %mul 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %add 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker %mul = fmul double %y, -1.234000e-01 96*9880d681SAndroid Build Coastguard Worker %add = fadd double %mul, %x 97*9880d681SAndroid Build Coastguard Worker ret double %add 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Canonicalize (x - -0.1234 / y) 101*9880d681SAndroid Build Coastguard Workerdefine double @test9(double %x, double %y) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fdiv double 1.234000e-01, %y 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fadd double %x, %div 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker %div = fdiv double -1.234000e-01, %y 108*9880d681SAndroid Build Coastguard Worker %sub = fsub double %x, %div 109*9880d681SAndroid Build Coastguard Worker ret double %sub 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; Don't modify (-0.1234 / y - x) 113*9880d681SAndroid Build Coastguard Workerdefine double @test10(double %x, double %y) { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fdiv double -1.234000e-01, %y 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %div, %x 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %sub 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker %div = fdiv double -1.234000e-01, %y 120*9880d681SAndroid Build Coastguard Worker %sub = fsub double %div, %x 121*9880d681SAndroid Build Coastguard Worker ret double %sub 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; Canonicalize (-0.1234 / y + x) -> (x - 0.1234 / y) 125*9880d681SAndroid Build Coastguard Workerdefine double @test11(double %x, double %y) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fdiv double 1.234000e-01, %y 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %div 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %add 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker %div = fdiv double -1.234000e-01, %y 132*9880d681SAndroid Build Coastguard Worker %add = fadd double %div, %x 133*9880d681SAndroid Build Coastguard Worker ret double %add 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; Canonicalize (y / -0.1234 + x) -> (x - y / 0.1234) 137*9880d681SAndroid Build Coastguard Workerdefine double @test12(double %x, double %y) { 138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fdiv double %y, 1.234000e-01 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fsub double %x, %div 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %add 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker %div = fdiv double %y, -1.234000e-01 144*9880d681SAndroid Build Coastguard Worker %add = fadd double %div, %x 145*9880d681SAndroid Build Coastguard Worker ret double %add 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; Don't create an NSW violation 149*9880d681SAndroid Build Coastguard Workerdefine i4 @test13(i4 %x) { 150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[mul:.*]] = mul nsw i4 %x, -2 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[add:.*]] = add i4 %[[mul]], 3 153*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i4 %x, -2 154*9880d681SAndroid Build Coastguard Worker %add = add i4 %mul, 3 155*9880d681SAndroid Build Coastguard Worker ret i4 %add 156*9880d681SAndroid Build Coastguard Worker} 157