diff --git a/llvm/lib/Target/LoongArch/LoongArchSubtarget.h b/llvm/lib/Target/LoongArch/LoongArchSubtarget.h --- a/llvm/lib/Target/LoongArch/LoongArchSubtarget.h +++ b/llvm/lib/Target/LoongArch/LoongArchSubtarget.h @@ -45,6 +45,7 @@ LoongArchInstrInfo InstrInfo; LoongArchRegisterInfo RegInfo; LoongArchTargetLowering TLInfo; + SelectionDAGTargetInfo TSInfo; /// Initializes using the passed in CPU and feature strings so that we can /// use initializer lists for subtarget initialization. @@ -73,6 +74,9 @@ const LoongArchTargetLowering *getTargetLowering() const override { return &TLInfo; } + const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { + return &TSInfo; + } bool is64Bit() const { return HasLA64; } bool hasBasicF() const { return HasBasicF; } bool hasBasicD() const { return HasBasicD; } diff --git a/llvm/test/CodeGen/LoongArch/memcmp.ll b/llvm/test/CodeGen/LoongArch/memcmp.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/memcmp.ll @@ -0,0 +1,24 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s + +;; Before getSelectionDAGInfo() interface hooks were defined DAGBuilder +;; would crash. + +define signext i32 @test1(ptr %buffer1, ptr %buffer2) { +; CHECK-LABEL: test1: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: addi.d $sp, $sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset 1, -8 +; CHECK-NEXT: ori $a2, $zero, 16 +; CHECK-NEXT: bl %plt(memcmp) +; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; CHECK-NEXT: addi.d $sp, $sp, 16 +; CHECK-NEXT: ret +entry: + %call = call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 16) + ret i32 %call +} + +declare signext i32 @memcmp(ptr, ptr, i64)