mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
62ad0a5cf3
As noted in the D44909 review, the transform from (fptosi+sitofp) to ftrunc can produce -0.0 where the original code does not: #include <stdio.h> int main(int argc) { float x; x = -0.8 * argc; printf("%f\n", (float)((int)x)); return 0; } $ clang -O0 -mavx fp.c ; ./a.out 0.000000 $ clang -O1 -mavx fp.c ; ./a.out -0.000000 Ideally, we'd use IR/node flags to predicate the transform, but the IR parser doesn't currently allow fast-math-flags on the cast instructions. So for now, just use the function attribute that corresponds to clang's "-fno-signed-zeros" option. Differential Revision: https://reviews.llvm.org/D48085 llvm-svn: 335761
46 lines
1.1 KiB
LLVM
46 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=aarch64-unknown-unknown < %s | FileCheck %s
|
|
|
|
define float @trunc_unsigned_f32(float %x) #0 {
|
|
; CHECK-LABEL: trunc_unsigned_f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: frintz s0, s0
|
|
; CHECK-NEXT: ret
|
|
%i = fptoui float %x to i32
|
|
%r = uitofp i32 %i to float
|
|
ret float %r
|
|
}
|
|
|
|
define double @trunc_unsigned_f64(double %x) #0 {
|
|
; CHECK-LABEL: trunc_unsigned_f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: frintz d0, d0
|
|
; CHECK-NEXT: ret
|
|
%i = fptoui double %x to i64
|
|
%r = uitofp i64 %i to double
|
|
ret double %r
|
|
}
|
|
|
|
define float @trunc_signed_f32(float %x) #0 {
|
|
; CHECK-LABEL: trunc_signed_f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: frintz s0, s0
|
|
; CHECK-NEXT: ret
|
|
%i = fptosi float %x to i32
|
|
%r = sitofp i32 %i to float
|
|
ret float %r
|
|
}
|
|
|
|
define double @trunc_signed_f64(double %x) #0 {
|
|
; CHECK-LABEL: trunc_signed_f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: frintz d0, d0
|
|
; CHECK-NEXT: ret
|
|
%i = fptosi double %x to i64
|
|
%r = sitofp i64 %i to double
|
|
ret double %r
|
|
}
|
|
|
|
attributes #0 = { "no-signed-zeros-fp-math"="true" }
|
|
|