diff --git a/llvm/lib/Target/Mips/Mips64InstrInfo.td b/llvm/lib/Target/Mips/Mips64InstrInfo.td --- a/llvm/lib/Target/Mips/Mips64InstrInfo.td +++ b/llvm/lib/Target/Mips/Mips64InstrInfo.td @@ -683,6 +683,15 @@ def : MipsPat<(add GPR64:$hi, (MipsHigher (i64 tconstpool:$lo))), (DADDiu GPR64:$hi, tconstpool:$lo)>, ISA_MIPS3, GPR_64, SYM_64; + def : MipsPat<(shl (MipsHi (i64 tglobaladdr:$in)), (i32 16)), + (LUi64 tglobaladdr:$in)>, ISA_MIPS3, GPR_64; + def : MipsPat<(shl (MipsHi (i64 tblockaddress:$in)), (i32 16)), + (LUi64 tblockaddress:$in)>, ISA_MIPS3, GPR_64; + def : MipsPat<(shl (MipsHi (i64 tjumptable:$in)), (i32 16)), + (LUi64 tjumptable:$in)>, ISA_MIPS3, GPR_64; + def : MipsPat<(shl (MipsHi (i64 tconstpool:$in)), (i32 16)), + (LUi64 tconstpool:$in)>, ISA_MIPS3, GPR_64; + def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tglobaladdr:$lo))), (DADDiu GPR64:$hi, tglobaladdr:$lo)>, ISA_MIPS3, GPR_64, SYM_64; def : MipsPat<(add GPR64:$hi, (MipsHi (i64 tblockaddress:$lo))), diff --git a/llvm/test/CodeGen/Mips/global-address-with-mask.ll b/llvm/test/CodeGen/Mips/global-address-with-mask.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/Mips/global-address-with-mask.ll @@ -0,0 +1,27 @@ +; RUN: llc -mtriple=mips64-linux-gnuabi64 \ +; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=PIC +; RUN: llc -mtriple=mips64-linux-gnuabi64 \ +; RUN: -relocation-model=static < %s | FileCheck %s -check-prefix=STATIC + +define void @bar() nounwind { +entry: +; PIC: lui $[[R0:[0-9]+]], 4095 +; PIC-NEXT: ori $[[R0]], $[[R0]], 65535 +; PIC-NEXT: ld $[[R1:[0-9]+]], %got_disp(foo)(${{[0-9]+}}) +; PIC-NEXT: and $[[R1]], $[[R1]], $[[R0]] +; PIC-NEXT: sd $[[R1]] + +; STATIC: lui $[[R0:[0-9]+]], 4095 +; STATIC-NEXT: ori $[[R0]], $[[R0]], 65535 +; STATIC-NEXT: lui $[[R1:[0-9]+]], %hi(foo) +; STATIC-NEXT: daddiu $[[R1]], $[[R1]], %lo(foo) +; STATIC-NEXT: and $[[R0]], $[[R1]], $[[R0]] +; STATIC-NEXT: sd $[[R0]] + + %val = alloca i64, align 8 + store i64 and (i64 ptrtoint (void ()* @foo to i64), i64 268435455), i64* %val, align 8 + %0 = load i64, i64* %val, align 8 + ret void +} + +declare void @foo()