Commit e86be1fd authored by Matt Arsenault's avatar Matt Arsenault
Browse files

ValueTracking: frexp never introduces poison

parent 5dbeed2e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6582,6 +6582,7 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
      case Intrinsic::maximum:
      case Intrinsic::is_fpclass:
      case Intrinsic::ldexp:
      case Intrinsic::frexp:
        return false;
      case Intrinsic::lround:
      case Intrinsic::llround:
+38 −0
Original line number Diff line number Diff line
@@ -528,6 +528,43 @@ define float @freeze_ldexp(float %arg0, i32 noundef %arg1) {
  ret float %freeze
}

define { float, i32 } @freeze_frexp(float %arg0) {
; CHECK-LABEL: @freeze_frexp(
; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
; CHECK-NEXT:    ret { float, i32 } [[OP]]
;
  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
  %freeze = freeze { float, i32 } %op
  ret { float, i32 } %freeze
}

define float @freeze_frexp_0(float %arg0) {
; CHECK-LABEL: @freeze_frexp_0(
; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
; CHECK-NEXT:    [[EXTRACT_0:%.*]] = extractvalue { float, i32 } [[OP]], 0
; CHECK-NEXT:    ret float [[EXTRACT_0]]
;
  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
  %extract.0 = extractvalue { float, i32 } %op, 0
  %freeze = freeze float %extract.0
  ret float %freeze
}

define i32 @freeze_frexp_1(float %arg0) {
; CHECK-LABEL: @freeze_frexp_1(
; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze float [[ARG0:%.*]]
; CHECK-NEXT:    [[OP:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[ARG0_FR]])
; CHECK-NEXT:    [[EXTRACT_1:%.*]] = extractvalue { float, i32 } [[OP]], 1
; CHECK-NEXT:    ret i32 [[EXTRACT_1]]
;
  %op = call { float, i32 } @llvm.frexp.f32.i32(float %arg0)
  %extract.1 = extractvalue { float, i32 } %op, 1
  %freeze = freeze i32 %extract.1
  ret i32 %freeze
}

declare float @llvm.fma.f32(float, float, float)
declare float @llvm.fmuladd.f32(float, float, float)
declare float @llvm.sqrt.f32(float)
@@ -562,3 +599,4 @@ declare float @llvm.maximum.f32(float, float)
declare i1 @llvm.is.fpclass.f32(float, i32 immarg)
declare float @llvm.fptrunc.round.f32.f64(double, metadata)
declare float @llvm.ldexp.f32.i32(float, i32)
declare { float, i32 } @llvm.frexp.f32.i32(float)