1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @func1( 6*9880d681SAndroid Build Coastguard Workerdefine float @func1(float %a, float %b, float %c, i1 %cond) { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %cond.true, label %cond.false 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workercond.true: 11*9880d681SAndroid Build Coastguard Worker %sub0 = fsub fast float %a, %b 12*9880d681SAndroid Build Coastguard Worker br label %cond.end 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workercond.false: 15*9880d681SAndroid Build Coastguard Worker %sub1 = fsub fast float %a, %c 16*9880d681SAndroid Build Coastguard Worker br label %cond.end 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; The fast-math flags should always be transfered if possible. 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cond.end 20*9880d681SAndroid Build Coastguard Worker; CHECK [[PHI:%[^ ]*]] = phi float [ %b, %cond.true ], [ %c, %cond.false ] 21*9880d681SAndroid Build Coastguard Worker; CHECK fsub fast float %a, [[PHI]] 22*9880d681SAndroid Build Coastguard Workercond.end: 23*9880d681SAndroid Build Coastguard Worker %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 24*9880d681SAndroid Build Coastguard Worker ret float %e 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @func2( 28*9880d681SAndroid Build Coastguard Workerdefine float @func2(float %a, float %b, float %c, i1 %cond) { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %cond.true, label %cond.false 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workercond.true: 33*9880d681SAndroid Build Coastguard Worker %sub0 = fsub fast float %a, %b 34*9880d681SAndroid Build Coastguard Worker br label %cond.end 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workercond.false: 37*9880d681SAndroid Build Coastguard Worker %sub1 = fsub float %a, %c 38*9880d681SAndroid Build Coastguard Worker br label %cond.end 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; The fast-math flags should always be transfered if possible. 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cond.end 42*9880d681SAndroid Build Coastguard Worker; CHECK [[PHI:%[^ ]*]] = phi float [ %b, %cond.true ], [ %c, %cond.false ] 43*9880d681SAndroid Build Coastguard Worker; CHECK fsub float %a, [[PHI]] 44*9880d681SAndroid Build Coastguard Workercond.end: 45*9880d681SAndroid Build Coastguard Worker %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 46*9880d681SAndroid Build Coastguard Worker ret float %e 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @func3( 50*9880d681SAndroid Build Coastguard Workerdefine float @func3(float %a, float %b, float %c, i1 %cond) { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %cond.true, label %cond.false 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workercond.true: 55*9880d681SAndroid Build Coastguard Worker %sub0 = fsub fast float %a, 2.0 56*9880d681SAndroid Build Coastguard Worker br label %cond.end 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workercond.false: 59*9880d681SAndroid Build Coastguard Worker %sub1 = fsub fast float %b, 2.0 60*9880d681SAndroid Build Coastguard Worker br label %cond.end 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cond.end 63*9880d681SAndroid Build Coastguard Worker; CHECK [[PHI:%[^ ]*]] = phi float [ %a, %cond.true ], [ %b, %cond.false ] 64*9880d681SAndroid Build Coastguard Worker; CHECK fadd fast float %a, [[PHI]] 65*9880d681SAndroid Build Coastguard Workercond.end: 66*9880d681SAndroid Build Coastguard Worker %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 67*9880d681SAndroid Build Coastguard Worker ret float %e 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @func4( 71*9880d681SAndroid Build Coastguard Workerdefine float @func4(float %a, float %b, float %c, i1 %cond) { 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %cond.true, label %cond.false 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workercond.true: 76*9880d681SAndroid Build Coastguard Worker %sub0 = fsub fast float %a, 2.0 77*9880d681SAndroid Build Coastguard Worker br label %cond.end 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workercond.false: 80*9880d681SAndroid Build Coastguard Worker %sub1 = fsub float %b, 2.0 81*9880d681SAndroid Build Coastguard Worker br label %cond.end 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cond.end 84*9880d681SAndroid Build Coastguard Worker; CHECK [[PHI:%[^ ]*]] = phi float [ %a, %cond.true ], [ %b, %cond.false ] 85*9880d681SAndroid Build Coastguard Worker; CHECK fadd float %a, [[PHI]] 86*9880d681SAndroid Build Coastguard Workercond.end: 87*9880d681SAndroid Build Coastguard Worker %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 88*9880d681SAndroid Build Coastguard Worker ret float %e 89*9880d681SAndroid Build Coastguard Worker} 90