Description
Bugzilla Link | 52119 |
Version | trunk |
OS | All |
Attachments | Diagnostic report when attempting to compile the generated LLVM-IR with llc. |
CC | @AnnikaCodes,@glaubitz,@tcr,@jrtc27,@mshockwave |
Extended Description
LLVM's new m68k target can't handle left-shifts and right-shifts of two 64-bit integers. This bug isn't specific to C or Clang (it can be reproduced with Rust as well), but the following C program is an easy way to reproduce it:
void llvm_bug() {
unsigned long long x = 2;
unsigned long long y = 2;
unsigned long long result = x >> y;
}
It builds fine under an m68k GCC cross-compiler, but under Clang, throws the following error: Cannot select: 0x7fc3c1017300: i32,i32 = srl_parts 0x7fc3c10171c8, 0x7fc3c1017160, 0x7fc3c1017090.
This is the output when building the above program (saved as shift.c) with bin/clang -target m68k-unknown-linux-gnu shift.c -nostdlib
:
fatal error: error in backend: Cannot select: 0x7f9644092b00: i32,i32 = srl_parts 0x7f96440929c8, 0x7f9644092960, 0x7f9644092890
0x7f96440929c8: i32,ch = load<(dereferenceable load (s32) from %ir.1 + 4, basealign 8)> 0x7f96440927c0, 0x7f96440926f0, undef:i32
0x7f96440926f0: i32 = or FrameIndex:i32<0>, Constant:i32<4>
0x7f9644091e68: i32 = FrameIndex<0>
0x7f96440924e8: i32 = Constant<4>
0x7f9644091f38: i32 = undef
0x7f9644092960: i32,ch = load<(dereferenceable load (s32) from %ir.1, align 8)> 0x7f96440927c0, FrameIndex:i32<0>, undef:i32
0x7f9644091e68: i32 = FrameIndex<0>
0x7f9644091f38: i32 = undef
0x7f9644092890: i32,ch = load<(dereferenceable load (s32) from %ir.2 + 4, basealign 8)> 0x7f96440927c0, 0x7f96440928f8, undef:i32
0x7f96440928f8: i32 = or FrameIndex:i32<1>, Constant:i32<4>
0x7f9644092008: i32 = FrameIndex<1>
0x7f96440924e8: i32 = Constant<4>
0x7f9644091f38: i32 = undef
In function: llvm_bug
clang-14: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 14.0.0 (https://github.com/llvm/llvm-project.git 9697f93)
Target: m68k-unknown-linux-gnu
Thread model: posix
InstalledDir: /Users/annika/llvm-project/build/bin
clang-14: note: diagnostic msg:
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-14: note: diagnostic msg: /var/folders/cn/qwypwgqn3vn7wwn5ksn9lr5w0000gn/T/shift-5ddeee.c
clang-14: note: diagnostic msg: /var/folders/cn/qwypwgqn3vn7wwn5ksn9lr5w0000gn/T/shift-5ddeee.sh
clang-14: note: diagnostic msg: Crash backtrace is located in
clang-14: note: diagnostic msg: /Users/annika/Library/Logs/DiagnosticReports/clang-14__.crash
clang-14: note: diagnostic msg: (choose the .crash file that corresponds to your crash)
clang-14: note: diagnostic msg:
For some reason, clang didn't generate the .crash
file it was talking about, but compiling to LLVM-IR and then using llc made the proper diagnostic report, which I have attached.
I understand that m68k support is experimental, but I would still like to report this bug in hopes that it will either eventually be fixed, or someone can help me to fix it myself.
Thanks!