From 19e75717eff2c22e6643addcc44caa8dc2f0125f Mon Sep 17 00:00:00 2001 From: Anatoly Trosinenko Date: Tue, 30 Jun 2020 11:04:17 +0300 Subject: [PATCH] [MSP430] Declare comparison LibCalls as returning i16 instead of i32 For TI's distribution of msp430-gcc ``` msp430-elf-gcc -S -o- -Os -x c - <<< "int f(float a, float b) { return a != b; }" ``` does not mention `R13` at all. `__libgcc_cmp_return__` machine mode is 2 byte on MSP430, as well. Differential Revision: https://reviews.llvm.org/D82635 --- llvm/lib/Target/MSP430/MSP430ISelLowering.h | 4 ++++ llvm/test/CodeGen/MSP430/cmp-return-type.ll | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 llvm/test/CodeGen/MSP430/cmp-return-type.ll diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.h b/llvm/lib/Target/MSP430/MSP430ISelLowering.h index 650f9a7..f23042a 100644 --- a/llvm/lib/Target/MSP430/MSP430ISelLowering.h +++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.h @@ -79,6 +79,10 @@ namespace llvm { return MVT::i8; } + MVT::SimpleValueType getCmpLibcallReturnType() const override { + return MVT::i16; + } + /// LowerOperation - Provide custom lowering hooks for some operations. SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; diff --git a/llvm/test/CodeGen/MSP430/cmp-return-type.ll b/llvm/test/CodeGen/MSP430/cmp-return-type.ll new file mode 100644 index 0000000..6c3f31d --- /dev/null +++ b/llvm/test/CodeGen/MSP430/cmp-return-type.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16" +target triple = "msp430" + +define i16 @f(float %a, float %b) optsize { + %cmp = fcmp une float %a, %b + %conv = zext i1 %cmp to i16 +; CHECK-LABEL: call #__mspabi_cmpf +; CHECK-NOT: r13 +; CHECK-LABEL: mov r2 + +; This is quite fragile attempt to detect the return type: +; Correct: +; call #__mspabi_cmpf +; tst r12 +; mov r2, r13 +; Incorrect: +; call #__mspabi_cmpf +; bis r12, r13 <-- checking (R12:R13) +; tst r13 +; mov r2, r13 + + ret i16 %conv +} -- 2.7.4