diff --git a/llvm/lib/Target/Mips/Mips64InstrInfo.td b/llvm/lib/Target/Mips/Mips64InstrInfo.td index 49e463cfd212c..ef4eea8c50dc6 100644 --- a/llvm/lib/Target/Mips/Mips64InstrInfo.td +++ b/llvm/lib/Target/Mips/Mips64InstrInfo.td @@ -770,6 +770,9 @@ let AdditionalPredicates = [NotInMicroMips] in { ISA_MIPS3, GPR_64, SYM_64; } +def : MipsPat<(MipsGPRel tglobaladdr:$in), + (DADDiu ZERO_64, tglobaladdr:$in)>, ISA_MIPS3, ABI_N64; + // gp_rel relocs def : MipsPat<(add GPR64:$gp, (MipsGPRel tglobaladdr:$in)), (DADDiu GPR64:$gp, tglobaladdr:$in)>, ISA_MIPS3, ABI_N64; diff --git a/llvm/test/CodeGen/Mips/llvm-ir/select-globaladdr.ll b/llvm/test/CodeGen/Mips/llvm-ir/select-globaladdr.ll new file mode 100644 index 0000000000000..7e6a6b0dbcecd --- /dev/null +++ b/llvm/test/CodeGen/Mips/llvm-ir/select-globaladdr.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -mattr +noabicalls -mgpopt | FileCheck %s -check-prefixes=MIPS64 + +target triple = "mips64-unknown-linux-muslabi64" + +@.str = external constant [6 x i8] +@.str.1 = external constant [6 x i8] + +define ptr @tst_select_ptr_ptr(i1 %tobool.not) { +; MIPS64-LABEL: tst_select_ptr_ptr: +; MIPS64: # %bb.0: # %entry +; MIPS64-NEXT: sll $1, $4, 0 +; MIPS64-NEXT: andi $1, $1, 1 +; MIPS64-NEXT: daddiu $2, $zero, %gp_rel(.str) +; MIPS64-NEXT: daddiu $3, $zero, %gp_rel(.str.1) +; MIPS64-NEXT: movn $2, $3, $1 +; MIPS64-NEXT: jr $ra +; MIPS64-NEXT: daddu $2, $gp, $2 +entry: + %cond = select i1 %tobool.not, ptr @.str.1, ptr @.str + ret ptr %cond +}