Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DAGCombine] (float)((int) f) --> ftrunc (PR36617)
This was originally committed at rL328921 and reverted at rL329920 to investigate failures in Chrome. This time I've added to the ReleaseNotes to warn users of the potential of exposing UB and let me repeat that here for more exposure: Optimization of floating-point casts is improved. This may cause surprising results for code that is relying on undefined behavior. Code sanitizers can be used to detect affected patterns such as this: int main() { float x = 4294967296.0f; x = (float)((int)x); printf("junk in the ftrunc: %f\n", x); return 0; } $ clang -O1 ftrunc.c -fsanitize=undefined ; ./a.out ftrunc.c:5:15: runtime error: 4.29497e+09 is outside the range of representable values of type 'int' junk in the ftrunc: 0.000000 Original commit message: fptosi / fptoui round towards zero, and that's the same behavior as ISD::FTRUNC, so replace a pair of casts with the equivalent node. We don't have to account for special cases (NaN, INF) because out-of-range casts are undefined. Differential Revision: https://reviews.llvm.org/D44909 llvm-svn: 330437
- Loading branch information
1 parent
863ffeb
commit 3d453ad
Showing
11 changed files
with
123 additions
and
331 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: llc -mtriple=armv7-eabi < %s | FileCheck %s | ||
|
||
define float @trunc_unsigned_f32(float %x) nounwind { | ||
; CHECK-LABEL: trunc_unsigned_f32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: vmov s0, r0 | ||
; CHECK-NEXT: vcvt.u32.f32 s0, s0 | ||
; CHECK-NEXT: vcvt.f32.u32 s0, s0 | ||
; CHECK-NEXT: vmov r0, s0 | ||
; CHECK-NEXT: bx lr | ||
%i = fptoui float %x to i32 | ||
%r = uitofp i32 %i to float | ||
ret float %r | ||
} | ||
|
||
define double @trunc_unsigned_f64_i64(double %x) nounwind { | ||
; CHECK-LABEL: trunc_unsigned_f64_i64: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: .save {r11, lr} | ||
; CHECK-NEXT: push {r11, lr} | ||
; CHECK-NEXT: bl __aeabi_d2ulz | ||
; CHECK-NEXT: bl __aeabi_ul2d | ||
; CHECK-NEXT: pop {r11, pc} | ||
%i = fptoui double %x to i64 | ||
%r = uitofp i64 %i to double | ||
ret double %r | ||
} | ||
|
||
define double @trunc_unsigned_f64_i32(double %x) nounwind { | ||
; CHECK-LABEL: trunc_unsigned_f64_i32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: vmov d16, r0, r1 | ||
; CHECK-NEXT: vcvt.u32.f64 s0, d16 | ||
; CHECK-NEXT: vcvt.f64.u32 d16, s0 | ||
; CHECK-NEXT: vmov r0, r1, d16 | ||
; CHECK-NEXT: bx lr | ||
%i = fptoui double %x to i32 | ||
%r = uitofp i32 %i to double | ||
ret double %r | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.