<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/88365>88365</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Compiler crash with "error in backend: Should only materialize 32-bit constants for RV32"
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mablinov
      </td>
    </tr>
</table>

<pre>
    Hi all,
 
While porting gcc test cases to llvm, I came across [`pr50092.c`](https://github.com/gcc-mirror/gcc/blob/master/gcc/testsuite/gcc.dg/torture/pr50092.c), which crashes the compiler with
 
```
fatal error: error in backend: Should only materialize 32-bit constants for RV32
```

Some of the backtrace:
```
 #7 0x0000559e9511a34f llvm::RISCVInstrInfo::movImm(llvm::MachineBasicBlock&, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::DebugLoc const&, llvm::Register, unsigned long, llvm::MachineInstr::MIFlag, bool, bool) const (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0xc4a34f)
 #8 0x0000559e951221bc llvm::RISCVRegisterInfo::adjustReg(llvm::MachineBasicBlock&, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::DebugLoc const&, llvm::Register, llvm::Register, llvm::StackOffset, llvm::MachineInstr::MIFlag, llvm::MaybeAlign) const (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0xc521bc)
 #9 0x0000559e951a6b01 llvm::RISCVFrameLowering::emitPrologue(llvm::MachineFunction&, llvm::MachineBasicBlock&) const (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0xcd6b01)
#10 0x0000559e95990424 (anonymous namespace)::PEI::runOnMachineFunction(llvm::MachineFunction&) PrologEpilogInserter.cpp:0:0
#11 0x0000559e955fcdb0 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#12 0x0000559e95b8d20a llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x16bd20a)
#13 0x0000559e95b8d394 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x16bd394)
#14 0x0000559e95b8ddf4 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x16bddf4)
#15 0x0000559e962fd602 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x1e2d602)
#16 0x0000559e968b1e11 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x23e1e11)
#17 0x0000559e982397f9 clang::ParseAST(clang::Sema&, bool, bool) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x3d697f9)
#18 0x0000559e96b50571 clang::FrontendAction::Execute() (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x2680571)
#19 0x0000559e96ace989 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x25fe989)
#20 0x0000559e96c16a03 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0x2746a03)
#21 0x0000559e950f8b23 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/maxim/src/riscv-gnu-toolchain/opt/riscv/bin/clang+0xc28b23)
```

`pr50092.c`:
```c
/* PR target/50092 */
/* { dg-do compile { target lp64 } } */
 
volatile int v;
 
void bar (long double);
void baz (_Complex long double *);
 
void
foo (void)
{
  _Complex long double w[100000000];
  bar ((long double) v / 2147483648.0);
  baz (w);
}
```

The error message isn't technically accurate, since the 32-bit constant in question that's being materialized is `0xbebc1880` (`3199998080`), this value being taken right from [RISCVInstrInfo.cpp:750](https://github.com/llvm/llvm-project/blob/b2417f51dbbd7435eb3aaf203de24de6754da50e/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp#L750) where the check fails. `-mllvm -print-after-all` reports it as `3200000000`:

```
# *** IR Dump After Fixup Statepoint Caller Saved (fixup-statepoint-caller-saved) ***:
# Machine code for function foo: NoPHIs, TracksLiveness, NoVRegs, TiedOpsRewritten
Frame Objects:
 fi#0: size=3200000000, align=16, at location [SP]
  fi#1: size=16, align=16, at location [SP]
  fi#2: size=16, align=8, at location [SP]
 fi#3: size=16, align=8, at location [SP]
  fi#4: size=16, align=8, at location [SP]
  fi#5: size=16, align=8, at location [SP]
  fi#6: size=4, align=4, at location [SP]
```

It doesn't fit into a *signed* 32 bit int range, and for this reason fails the check at [RISCVInstrInfo.cpp:750](https://github.com/llvm/llvm-project/blob/b2417f51dbbd7435eb3aaf203de24de6754da50e/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp#L750).

A simple workaround is to do:

```diff
--- a/gcc/testsuite/gcc.dg/torture/pr50092.c
+++ b/gcc/testsuite/gcc.dg/torture/pr50092.c
@@ -9,7 +9,8 @@ void baz (_Complex long double *);
 void
 foo (void)
 {
-  _Complex long double w[100000000];
+  unsigned long l = 100000000;
+  _Complex long double w[l];
   bar ((long double) v / 2147483648.0);
   baz (w);
 }
```

and now this test case compiles. Viewing the disassembly:

```
pr50092.v.o:    file format elf32-littleriscv

Disassembly of section .text:

00000000 <foo>:
; {
       0: 19 71         addi    sp, sp, -128
       2: 86 de         sw      ra, 124(sp)
       4: a2 dc         sw      s0, 120(sp)
       6: 00 01         addi    s0, sp, 128
       8: 37 e5 f5 05   lui     a0, 24414
       c: 13 05 05 10   addi    a0, a0, 256
; unsigned long l = 100000000;
      10: 23 2a a4 fe   sw      a0, -12(s0)
;   _Complex long double w[l];
      14: 03 25 44 ff   lw a0, -12(s0)
      18: 8a 85         mv      a1, sp
      1a: 23 28 b4 fe   sw      a1, -16(s0)
      1e: 13 16 55 00   slli    a2, a0, 5
 22: 8a 85         mv      a1, sp
      24: 91 8d         sub     a1, a1, a2
      26: 23 26 b4 f8   sw      a1, -116(s0)
      2a: 2e 81 mv      sp, a1
      2c: 23 26 a4 fe   sw      a0, -20(s0)

... (cut) ...
```

There doesn't seem to be any fundamental issue generating unsigned 32 bit constants and subtracking the stack pointer with it. I tried looking at the git history of the logic but didn't get much from it - Is there a good reason why the frame lowering insists that the offset be signed? Does it just make the arithmetic easier?

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWl1z4jiz_jXOTReULX9gX-SChOEsVbPvpJI5cy6nZLlttJEtVpJJsr_-lCQDNiEzm93NW7UpgkHubj39oe6WDNWaNx3idZDeBOnqivZmK9V1S0vBO7m_KmX1cv0LBypEQG6DcBWES_CX_9tygbCTyvCugYYxMKgNMKpRg5EgxL4NyC1sgNEWgTIltQY7TxbuVBqGBZmzIAuDdBWQfGvMTgfxMiDrgKwbbrZ9OWeytV8Ym7VcKan8l4CsSyHLgKxbqg2eRu38uucG_ci8auygVKZXdug0KSkssKctZ1tgiuqtRbxFYLLdcYEKnrjZTpS1OP3Lfa2poQLQYYqX_gPwDkrKHrGr7NjDVvaiAtmJF2ipQcWp4H8gxGRWcgNMdtrQzmiopYL7bzG5OJF_f5AtgqwdRjuFUZShNdYlFghIvIDwOQzDME0LLNIoonFSe4fEyyBe3m8ebr9tOm3UpqulH2vlftO2AclPZL9StuUd3lDN2Y2Q7DEgmTXcKwon6qbvKoEbg4oaa5bby2RWQE2FxiD-NBW2wrJvPkvmbfNqrntsuHf3LfSdC9sKhOyatyENI5u1oI6qlFKcroWfCAKSB2S9lS26kHrmNui0shGluGb7WdP1MyOlYFvKu4Cs5c4c7tlYdGNMUIvkJnxmibW2jbGjO_KpOwiJSnbujoN6J4_Q6rdem3ts_iVO-dnog6Hs8UtdazR_3mVjqpcSl4I33ce5LrWembiumLqOZmUYnbturWiLn-UTKt41fhxbbu6UFLLp8ZL71n3HDJfdW847c-9H6VtZdY76BiSOwom-RREmJLHT0k52L63sNXS0Rb2zCYgUHvPdp43_oPruS_dKw59oX4A31KcdF7LZdBqVQTVnu10QL0P3f0QXTdClNavK8LXxDuLvqNYjYBcRnUEJSD7fUWXmof12Qd5lXGSCq8wrEtIRrvWdZf2VdrRB9X5E_6TLo6y04CY-j8_Rx0XyJ9D_KqtenEX3MPRRyOMimSBPzpFX9Ri5wIaylyFITzps2p046vFfxV_VU_zpGH9G6ioLCXgWh-dTy82N7ym-9GbXm4Dko9srTptOasOZ_tQ1vMMhnYxIfkFaoXpAqtj2y87GlZ6k8hHprazwf7D7CdVXqho0PyH6TLvmEsm4GNhkeY_1WfobHLA8EzgYYTmsjDHLpjOq13yP91jfdubOTMvcvh5ywJoLfHjRBtuhyGlT-Tt9x3_v8fvujFPRp--7J8UNftdGIW0nTBXWtBfme4UCDf6EMf40zPlapVvZ6b61tXL5EUGHxMbUJOiySdDlZYRR9CNgPo6obSS-KtppQa0T_rfjZ9G4fPh6KzuDz-ZjFhCJ0UKd6DJpdHMSF4u6GOtyR5XG5cPXKdIHbOkQkect4T-MOa4yC2mCedINZmUapouJ_dfKWvEY7D4RPCPr7cYm_wjDZrnFMAE56XsyyrDIi2my8FuljdvG-N3IEeZhmeZva_UxEZLWFudYETJpaDIWZTSMJynWQz7ps5eMvob_St8PWa5kkVh8EwWmPU9Y5yWJgbHoe-skjqrXUin6YlNqfMu2VB0y7_KQeyZj5Bb2klcfowcjFuVJjUub2vNjgFfbWXawwTogS7i7B-NKT0DWjgsc9PWEKFjcQNXMKnnYyrsRzwdilyUQLFb-f8Q87PH30mY2gcA7A_sgvjm7yysoqbKmsrtOqGRfCt8E30xI_rAk323ACHyGEa2ftLgkeThWkNLyer8cbLc4UMNFmU9BehOFw1-Qrk7SD2hfAYY9BGQNJEoWSR5nSe663Qmj0-FpPBosVj9w5tctDqcgLWpNGwSuu4AsDBhk244zKsQLUMZ6RW0auwXNO4buROPsRAR4B7_3qO0aBLOlJiALDSXyrhkfpFTANQRZGD6XWLIozy0kp24WxlFRFEUeurHhtMdsuYY9FT0Osgx9xA4Ub7YGaiVbCNKb6cHI0Osv0p-fUfnDLneZ7ZT8DZk5HVOVJIkWdRpVZVktkjjFMqa0JmFcIUkqzBZpUtE0xJEcbvm-HuLdwTpcp_BI_NniIwU8bVF5g7ItskeoKRd6bk00a61YmO0U78yM1gbVjAph7aVwJ5XRwA1QZ86YHGNpvCYvep7EPqLtCzb3sOrbHSyteFjz534HD4Ya3Em7nm6pEKjgge6xsl6qLcFMHwlmzBHMtCXwGWmQfAJB4sOODJis0J2c1cNuCWopg3gJ_5F3v2y0dfhXRdmj_sz32KF2I_-R3-6x8Tc5Vl92-h5tm2aw8zO4jTx8Ka379HFeqHlAYmsM0PwPDOLVyEjkFqg7k4hXkWsoqAExVBAbUQ93NnaGdeUERSNBA8v7BJA3BeQ_4Xfs8V9m9_zJ3-RP_yZ_NuJPxuzJj9kv5q2NgUrikKpqbpOPkUBt9PkTRhvaMYHS3wJFu8alL9pVLv5cWlFItQ1Bu-JGK5Caf3lOmY9NZY1uyw88SfVIlew7l4KNhEq-lSgqXtd-aDabAX3_Sf2w8G_8C8q_KiEJgySEma0ECwjIjf2QwzD87rp9qthwqWTDsWbP3lu0rZLT020QEMQrOFFPSN-ULqatwF_vBS42A_DjbsAujk4--cVxfCp06Mn0HL5xfHI1eItQcU21xrYULz-uNwef7ucu04PNB8JVgZYaQFHHZCa4MQJ9WzqStDrNAbIGjb5mzN1mdTrpwc4QxLeupnw6EcQ3MGrH3J8rC1EBiwgOf7SquL3qnetz3PssIvmEzyXxPIMKj3z6yV8VtRwRSQKSW-5iwujSLyVQsVeMOvSM4UVGlzfDEMILSMMT0nOguWWLF4Ap1CmEKQCInnt2x0aSJEomLMzZJLbEYQpROJrJswyMaXay65-LeS8_ckYnMRAKNIEaRzbwomcRsTYIT110fAPvWC12EmfoMAaSQpJAXVvFn96SP_A4Y-UU8vRo43Y_AIsGG4_p6UGRHMpzRSI_UXZxIhxMHGWQptarAFoIb2JyMnE6MBHyPmDEKV9EkFenKOvLEf3wTiZc2UGdzKmTX1Dnsj7EGwIhj464fDjSaELHTjO84Xkf_SPPu_f5fG6TGOuNzXnz-fzHexmFo7ZAI7a2zJUItHuxHWdFW-wMFcC17hEa7FBR9xj8GMZDz3B6zGtzou5LY7vSQ-rThrJHcP3v8NAZuJnDBozibilIR0qNo264gS3XRqqXw8NgIRvOoOwNVLzyaO1Ot-3Z1u9puIEZbFxTohAoNFJWh3blafvihNSu6xXD8yvgnebaaLf1cvele2Rn1R9aongNK4lu0_Bbrw209NFvPKjiZtui4QyQao4qiIct9lV1HVdFXNArvI4WEclJnBXh1fY6jRbhIorTMCMVy_KsCENclCxLsiJKSFxf8WsSkiRMoijMSRSH8xDrZEGjrC4rRiOaB0mILeVibvucuVTNlfPKdZ7HWXolaIlCu583ENLhk3dZQEiQrq7UtWuuyr7RQRIKq_ZJiuFGuN9F-E4pXcHhDMj_ZsD7KyDkn3n6T8hVr8T1u_tBp48OyNrp-_8BAAD__7b87Dg">