1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S -o - | FileCheck %s 3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5 6define float @func1(float %a, float %b, float %c, i1 %cond) { 7; CHECK-LABEL: @func1( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 10; CHECK: cond.true: 11; CHECK-NEXT: br label [[COND_END:%.*]] 12; CHECK: cond.false: 13; CHECK-NEXT: br label [[COND_END]] 14; CHECK: cond.end: 15; CHECK-NEXT: [[B_PN:%.*]] = phi float [ [[B:%.*]], [[COND_TRUE]] ], [ [[C:%.*]], [[COND_FALSE]] ] 16; CHECK-NEXT: [[E:%.*]] = fsub fast float [[A:%.*]], [[B_PN]] 17; CHECK-NEXT: ret float [[E]] 18; 19entry: 20 br i1 %cond, label %cond.true, label %cond.false 21 22cond.true: 23 %sub0 = fsub fast float %a, %b 24 br label %cond.end 25 26cond.false: 27 %sub1 = fsub fast float %a, %c 28 br label %cond.end 29 30; The fast-math flags should always be transfered if possible. 31cond.end: 32 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 33 ret float %e 34} 35 36define float @func2(float %a, float %b, float %c, i1 %cond) { 37; CHECK-LABEL: @func2( 38; CHECK-NEXT: entry: 39; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 40; CHECK: cond.true: 41; CHECK-NEXT: br label [[COND_END:%.*]] 42; CHECK: cond.false: 43; CHECK-NEXT: br label [[COND_END]] 44; CHECK: cond.end: 45; CHECK-NEXT: [[B_PN:%.*]] = phi float [ [[B:%.*]], [[COND_TRUE]] ], [ [[C:%.*]], [[COND_FALSE]] ] 46; CHECK-NEXT: [[E:%.*]] = fsub float [[A:%.*]], [[B_PN]] 47; CHECK-NEXT: ret float [[E]] 48; 49entry: 50 br i1 %cond, label %cond.true, label %cond.false 51 52cond.true: 53 %sub0 = fsub fast float %a, %b 54 br label %cond.end 55 56cond.false: 57 %sub1 = fsub float %a, %c 58 br label %cond.end 59 60; The fast-math flags should always be transfered if possible. 61cond.end: 62 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 63 ret float %e 64} 65 66define float @func3(float %a, float %b, float %c, i1 %cond) { 67; CHECK-LABEL: @func3( 68; CHECK-NEXT: entry: 69; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 70; CHECK: cond.true: 71; CHECK-NEXT: br label [[COND_END:%.*]] 72; CHECK: cond.false: 73; CHECK-NEXT: br label [[COND_END]] 74; CHECK: cond.end: 75; CHECK-NEXT: [[E_IN:%.*]] = phi float [ [[A:%.*]], [[COND_TRUE]] ], [ [[B:%.*]], [[COND_FALSE]] ] 76; CHECK-NEXT: [[E:%.*]] = fadd fast float [[E_IN]], -2.000000e+00 77; CHECK-NEXT: ret float [[E]] 78; 79entry: 80 br i1 %cond, label %cond.true, label %cond.false 81 82cond.true: 83 %sub0 = fsub fast float %a, 2.0 84 br label %cond.end 85 86cond.false: 87 %sub1 = fsub fast float %b, 2.0 88 br label %cond.end 89 90cond.end: 91 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 92 ret float %e 93} 94 95define float @func4(float %a, float %b, float %c, i1 %cond) { 96; CHECK-LABEL: @func4( 97; CHECK-NEXT: entry: 98; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 99; CHECK: cond.true: 100; CHECK-NEXT: br label [[COND_END:%.*]] 101; CHECK: cond.false: 102; CHECK-NEXT: br label [[COND_END]] 103; CHECK: cond.end: 104; CHECK-NEXT: [[E_IN:%.*]] = phi float [ [[A:%.*]], [[COND_TRUE]] ], [ [[B:%.*]], [[COND_FALSE]] ] 105; CHECK-NEXT: [[E:%.*]] = fadd float [[E_IN]], -2.000000e+00 106; CHECK-NEXT: ret float [[E]] 107; 108entry: 109 br i1 %cond, label %cond.true, label %cond.false 110 111cond.true: 112 %sub0 = fsub fast float %a, 2.0 113 br label %cond.end 114 115cond.false: 116 %sub1 = fsub float %b, 2.0 117 br label %cond.end 118 119cond.end: 120 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ] 121 ret float %e 122} 123