123 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S -o - | FileCheck %s3 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.false21 22cond.true:23 %sub0 = fsub fast float %a, %b24 br label %cond.end25 26cond.false:27 %sub1 = fsub fast float %a, %c28 br label %cond.end29 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 %e34}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.false51 52cond.true:53 %sub0 = fsub fast float %a, %b54 br label %cond.end55 56cond.false:57 %sub1 = fsub float %a, %c58 br label %cond.end59 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 %e64}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+0077; CHECK-NEXT: ret float [[E]]78;79entry:80 br i1 %cond, label %cond.true, label %cond.false81 82cond.true:83 %sub0 = fsub fast float %a, 2.084 br label %cond.end85 86cond.false:87 %sub1 = fsub fast float %b, 2.088 br label %cond.end89 90cond.end:91 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]92 ret float %e93}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+00106; CHECK-NEXT: ret float [[E]]107;108entry:109 br i1 %cond, label %cond.true, label %cond.false110 111cond.true:112 %sub0 = fsub fast float %a, 2.0113 br label %cond.end114 115cond.false:116 %sub1 = fsub float %b, 2.0117 br label %cond.end118 119cond.end:120 %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]121 ret float %e122}123