Files
clang-p2996/llvm/test/CodeGen/AVR/lround-conv.ll
Ayke van Laethem 0408b131eb [SelectionDAG][AVR] Add support for lrint and lround intrinsics
Integer legalization already supported splitting the output integer of
llround and llrint, but did not support this for lround and lrint yet.
This is not a problem for 32-bit architectures, but for 8/16-bit
architectures like AVR it results in a crash like this:

    ExpandIntegerResult #0: t7: i32 = lround t6

    LLVM ERROR: Do not know how to expand the result of this operator!

This patch simply add lrint/lround to the list of ISD opcodes to expand.

Fixes https://github.com/llvm/llvm-project/issues/59573.

Differential Revision: https://reviews.llvm.org/D140822
2023-01-08 18:56:07 +01:00

50 lines
1.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=avr -mcpu=atmega328p | FileCheck %s
define signext i16 @testmsws(float %x) {
; CHECK-LABEL: testmsws:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call lroundf
; CHECK-NEXT: movw r24, r22
; CHECK-NEXT: ret
entry:
%0 = tail call i32 @llvm.lround.i32.f32(float %x)
%conv = trunc i32 %0 to i16
ret i16 %conv
}
define i32 @testmsxs(float %x) {
; CHECK-LABEL: testmsxs:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call lroundf
; CHECK-NEXT: ret
entry:
%0 = tail call i32 @llvm.lround.i32.f32(float %x)
ret i32 %0
}
define signext i16 @testmswd(double %x) {
; CHECK-LABEL: testmswd:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call lround
; CHECK-NEXT: movw r24, r22
; CHECK-NEXT: ret
entry:
%0 = tail call i32 @llvm.lround.i32.f64(double %x)
%conv = trunc i32 %0 to i16
ret i16 %conv
}
define i32 @testmsxd(double %x) {
; CHECK-LABEL: testmsxd:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: call lround
; CHECK-NEXT: ret
entry:
%0 = tail call i32 @llvm.lround.i32.f64(double %x)
ret i32 %0
}
declare i32 @llvm.lround.i32.f32(float) nounwind readnone
declare i32 @llvm.lround.i32.f64(double) nounwind readnone