[PATCH] D39101: [RISCV 11.5/n] Codegen support for materializing constants

Alex Bradbury via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 19 10:38:55 PDT 2017


asb created this revision.

Splitting out support for materializing constants, as suggested by @reames in https://reviews.llvm.org/D29934.

This patch adds support and tests for materializing 32-bit constants.


https://reviews.llvm.org/D39101

Files:
  lib/Target/RISCV/RISCVInstrInfo.td
  test/CodeGen/RISCV/alu32.ll


Index: test/CodeGen/RISCV/alu32.ll
===================================================================
--- test/CodeGen/RISCV/alu32.ll
+++ test/CodeGen/RISCV/alu32.ll
@@ -161,3 +161,42 @@
   %1 = and i32 %a, %b
   ret i32 %1
 }
+
+; Materialize constants
+
+define i32 @zero() nounwind {
+; RV32I-LABEL: zero:
+; RV32I: addi a0, zero, 0
+; RV32I: jalr zero, ra, 0
+  ret i32 0
+}
+
+define i32 @pos_small() nounwind {
+; RV32I-LABEL: pos_small:
+; RV32I: addi a0, zero, 2047
+; RV32I: jalr zero, ra, 0
+  ret i32 2047
+}
+
+define i32 @neg_small() nounwind {
+; RV32I-LABEL: neg_small:
+; RV32I: addi a0, zero, -2048
+; RV32I: jalr zero, ra, 0
+  ret i32 -2048
+}
+
+define i32 @pos_i32() nounwind {
+; RV32I-LABEL: pos_i32:
+; RV32I: lui a0, 423811
+; RV32I: addi a0, a0, -1297
+; RV32I: jalr zero, ra, 0
+  ret i32 1735928559
+}
+
+define i32 @neg_i32() nounwind {
+; RV32I-LABEL: neg_i32:
+; RV32I: lui a0, 912092
+; RV32I: addi a0, a0, -273
+; RV32I: jalr zero, ra, 0
+  ret i32 -559038737
+}
Index: lib/Target/RISCV/RISCVInstrInfo.td
===================================================================
--- lib/Target/RISCV/RISCVInstrInfo.td
+++ lib/Target/RISCV/RISCVInstrInfo.td
@@ -86,6 +86,24 @@
   let DecoderMethod = "decodeSImmOperandAndLsl1<21>";
 }
 
+// Standalone (codegen-only) immleaf patterns.
+def simm32 : ImmLeaf<XLenVT, [{return isInt<32>(Imm);}]>;
+
+// Extract least significant 12 bits from an immediate value and sign extend
+// them.
+def LO12Sext : SDNodeXForm<imm, [{
+  return CurDAG->getTargetConstant(SignExtend64<12>(N->getZExtValue()),
+                                   SDLoc(N), N->getValueType(0));
+}]>;
+
+// Extract the most significant 20 bits from an immediate value. Add 1 if bit
+// 11 is 1, to compensate for the low 12 bits in the matching immediate addi
+// or ld/st being negative.
+def HI20 : SDNodeXForm<imm, [{
+  return CurDAG->getTargetConstant(((N->getZExtValue()+0x800) >> 12) & 0xfffff,
+                                   SDLoc(N), N->getValueType(0));
+}]>;
+
 //===----------------------------------------------------------------------===//
 // Instruction Class Templates
 //===----------------------------------------------------------------------===//
@@ -257,6 +275,11 @@
     : Pat<(OpNode GPR:$rs1, uimm5:$shamt),
           (Inst GPR:$rs1, uimm5:$shamt)>;
 
+/// Immediates
+
+def : Pat<(simm12:$imm), (ADDI X0, simm12:$imm)>;
+def : Pat<(simm32:$imm), (ADDI (LUI (HI20 imm:$imm)), (LO12Sext imm:$imm))>;
+
 /// Simple arithmetic operations
 
 def : PatGprGpr<add, ADD>;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39101.119600.patch
Type: text/x-patch
Size: 2538 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171019/671fc870/attachment.bin>


More information about the llvm-commits mailing list