| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: opt -S -passes=instcombine < %s | FileCheck %s |
| |
| define float @pr80941(float %arg) { |
| ; CHECK-LABEL: define float @pr80941( |
| ; CHECK-SAME: float [[ARG:%.*]]) { |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[COND:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[ARG]], i32 144) |
| ; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_EXIT:%.*]] |
| ; CHECK: if.then: |
| ; CHECK-NEXT: [[FPEXT:%.*]] = fpext float [[ARG]] to double |
| ; CHECK-NEXT: [[SIGN:%.*]] = call double @llvm.copysign.f64(double 0.000000e+00, double [[FPEXT]]) |
| ; CHECK-NEXT: [[FPTRUNC:%.*]] = fptrunc double [[SIGN]] to float |
| ; CHECK-NEXT: br label [[IF_EXIT]] |
| ; CHECK: if.exit: |
| ; CHECK-NEXT: [[RET:%.*]] = phi float [ [[FPTRUNC]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| entry: |
| %cond = tail call i1 @llvm.is.fpclass.f32(float %arg, i32 144) |
| br i1 %cond, label %if.then, label %if.exit |
| |
| if.then: |
| %fpext = fpext float %arg to double |
| %sign = call double @llvm.copysign.f64(double 0.000000e+00, double %fpext) |
| %fptrunc = fptrunc double %sign to float |
| br label %if.exit |
| |
| if.exit: |
| %ret = phi float [ %fptrunc, %if.then ], [ %arg, %entry ] |
| ret float %ret |
| } |