<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54459>54459</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
IR Outliner: Assertion failed: (VT.isInteger() && Operand.getValueType().isInteger() && "Invalid TRUNCATE!")
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:crash,
llvm:optimizations
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ornata
</td>
</tr>
</table>
<pre>
Sometimes the IR outliner creates outlined functions which SelectionDAG can't handle. This also crashes GlobalISel but differently. It could be a selector bug, but it's more likely an IR outliner bug.
### Reproducing the issue
Compile the attached LLVM IR using a debug build of clang:
**IR:** [crash.txt](https://github.com/llvm/llvm-project/files/8309899/crash.txt)
**Compiler explorer (which cannot reproduce this, but you can see what's outlined I guess)**: https://godbolt.org/z/e38b8cYhM
```
$ mv crash.txt crash.ll
$ clang -mllvm -ir-outliner -mllvm -ir-outlining-no-cost -O1 -arch arm64 -S -o /dev/null crash.ll
```
You should get
```
Assertion failed: (VT.isInteger() && Operand.getValueType().isInteger() && "Invalid TRUNCATE!"), function getNode, file SelectionDAG.cpp, line 5165
```
### Data dump
Focusing on the SDAG path, since that's where it showed up initially.
Plopping this into LLDB, we can see the issue shows up when selecting an outlined function:
```
(lldb) p Fn.getName()
(llvm::StringRef) $1 = (Data = "outlined_ir_func_1", Length = 18)
```
Ok, so what's inside the function?
```
(lldb) p Fn.dump()
; Function Attrs: minsize mustprogress nofree nounwind optsize
define internal void @outlined_ir_func_1(<9 x float> %0, <1 x float> %1, <3 x float>* %2, <3 x float>* %3, <3 x float>* %4) #2 {
newFuncRoot:
%5 = shufflevector <9 x float> %0, <9 x float> poison, <3 x i32> <i32 3, i32 4, i32 5>
%6 = shufflevector <9 x float> %0, <9 x float> poison, <3 x i32> <i32 6, i32 7, i32 8>
%7 = shufflevector <1 x float> %1, <1 x float> poison, <3 x i32> zeroinitializer
%8 = fmul contract <3 x float> %5, zeroinitializer
%9 = fmul contract <3 x float> %6, zeroinitializer
store <3 x float> %7, <3 x float>* %2, align 16
store <3 x float> %8, <3 x float>* %3, align 16
store <3 x float> %9, <3 x float>* %4, align 16
ret void
}
```
What is the state of the SelectionDAG?
```
(lldb) p DAG.dump()
SelectionDAG has 31 nodes:
t23: i64,ch = CopyFromReg t0, Register:i64 %8
t25: i64,ch = CopyFromReg t0, Register:i64 %9
t27: i64,ch = CopyFromReg t0, Register:i64 %10
t2: f32,ch = CopyFromReg t0, Register:f32 %0
t4: f32,ch = CopyFromReg t0, Register:f32 %1
t6: f32,ch = CopyFromReg t0, Register:f32 %2
t8: f32,ch = CopyFromReg t0, Register:f32 %3
t10: f32,ch = CopyFromReg t0, Register:f32 %4
t12: f32,ch = CopyFromReg t0, Register:f32 %5
t14: f32,ch = CopyFromReg t0, Register:f32 %6
t16: f32,ch = CopyFromReg t0, Register:f32 %7
t19: f32,ch = load<(load (s32) from %fixed-stack.1)> t0, FrameIndex:i64<-1>, undef:i64
t28: v9f32 = BUILD_VECTOR t2, t4, t6, t8, t10, t12, t14, t16, t19
t21: v2i32,ch = load<(load (s64) from %fixed-stack.0)> t0, FrameIndex:i64<-2>, undef:i64
t30: v1i32 = extract_subvector t21, Constant:i64<0>
t0: ch = EntryToken
```
What is it falling over trying to select?
```
frame #6: 0x000000010613e76a clang`llvm::SelectionDAG::getAnyExtOrTrunc(this=0x000000012cc2b250, Op=SDValue @ 0x00007ff7bfef62f0, DL=0x00007ff7bfef7c18, VT=EVT @ 0x00007ff7bfef62e0) at SelectionDAG.cpp:1361:5
1358 SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
1359 return VT.bitsGT(Op.getValueType()) ?
1360 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
-> 1361 getNode(ISD::TRUNCATE, DL, VT, Op);
1362 }
1363
1364 SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT) {
(lldb) p Op.dump()
t30: v1i32 = extract_subvector t21, Constant:i64<0>
```
CC: @AndrewLitteken
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFWFtv4jgU_jX0xQLlAoE88NByGSF1y4oy3Z2nykkc4q2xI9uh7fz6PccJkN5oB81qqxTMsf2d-_FxEpU9j2_Vllm-ZYbYgpHFiqjKCi6ZJqlm1AK9IWQkr2RquZKGPBY8LcgtE8wRppffSEplJxhaUlCZCdYj64IbQoVRgENNATjfhEqoWMAuklSWZDzPmWbSiuceWViSqkpkJGGEEuOAlYZ1m04wccu5BXhDtkozIvgDE8-EyhfywuJex5t2vMvmMwjrh6xYqVVWpVxunJbcmIq1l07UtuSCuUlqLU0LUPf6-u4PZFAZ3EdJxoADcOEgpspJKqjcdMIGgex54rNYId0NSWdw5QzQs0-2M5h2glFhbWncgjk8G26LKumlags_hNjtv7og8j9gBfiZg2gGvkehF4_iGEZHxCBuM2700IQ9lQIspQnwq50F_pHKEt2YAnXlZm_cZ1XhAjA8A9_S2tQHvy_IpmLGIC_HBWQnr5RQWaKE7SkN_pr_hH8WjpJR-qP444VHIq95Gpn7ZLsjB2WakRDHaWdk0t2iRUiX6-7B229o4KSuVN1UGUu6S590qQa1qd5GfdK9JV0FtphnbAefshLiNbNXornPH2AWU7i43DB7QpNLY5jGTCA5BftnaCGw_N26x81CWrZhGn6CAYEawUOWJdOQKD2AvaOiYuvnktUrPtrRCYKF3FHBM7Jefb-ZXK5nncAHqnPL5JCcKOmNypijYUy3s7SXliVOoAnJwI8GJ5Q_ps-UWoj-alu2p-cqrRMDWGLa3GIRKKktEB8mXIQ1kfRYQKJDBqMxHyGgqpKAvyynAnK_DfqnUGVZZylUDy6tgiycXiHkIztE6CGFHZ5BOOAgm7LhklW-rVqHVP0gFkdCZAkavCRziY65odvGJ60lkJ8hJsCt1cBoxfLaRX2fdMIp-twZqx4Hexnuub5HMe5rf03INZMbW7hlfovBe25YPjiDqmNecml4VlvhqNv8F3RzrmwrFl6R-T58Lq3VmNhki3x-MrKtjIWasdFQAohUuQYPSFXJRy6hDpYWF9U4GcsxrsBtTEsqyE5BsHb63ntmGHXCSUyeSC4UqBXOwFwDDzUFuv-K7jf0sEV3pTUYBB9PhR9P9WunhQHpDK9q2SV7RBOslLLHmo5rB85LpqjyXLBdfSydkP0FvVTcgHOOcvAwcOvDCYyIkxAH_f1ggDIeeUf_He9oz3K4H4xe8h6-z_sj3_hf4f2TadUkPgSNbnEbOW75toK6rKTVNLWvfeecgZgfo8RfQ4lOoBiLDcY7m4afBCHAbCTxo0-BRp-E7JeB4pMB_hZIM-tSskn64fRE1fkLig3UWFdkjIU2EDseV-Zbp8kvVB08e16XnRftY0ENCX0oLBkzrQS0cAJBLeIRapTWFXOiyue5VtsVg3PCxT6MuIGiA0thZW3kA8DgLID4CDA8C8D39giIgRB5GHwRIsfKhHl9ROifheC3EKKzEIIWwugshLCFAEY5B6LfhjjPloM2xHnGjNoQ51lz2IaI30BAEkPrOMHMgRF2EwanY5IDLu7P-RPLupCQ6UPPx0SCSlDzmmvoVhYyY091CAJM13cFYUIqIOcN-RDVzpm72AkGrK--L66n93ezyXq5wniFbdZVEeuqpXVVC_3nvup5v17g1yv8uB3wvoMP-CfqRf2P1PM-VS84oV7oAm3n80Y99uROg3tTJc1ZhiLC5glcZy2V9gDrtY5B61Aa6WdwoDyv1QOTX6ib0Ovm0N26_ngHtxXY6tpa1TSpp0tnjtpig-KizHvy6j_fi_yQDSPa3D0jr9WPvqjLSIEO9lI-z57sUq81tDZgbnflC6dHwCBNg6RpIJYlTN1O3XUEu7aG7zDPh0nO8ijI3bLp9QFhPzVMfRced2uYmt2t393N0KFwuX57Hwkv_TDCeDnmqB9iBY_30nxJuf3ipbvhpOhXuJRcqxRvUCA1EFE2EBKbv33fVzOD0I3dAVlpCSt6CbfmGywcLct3rmgOYO9AB4COizHwD5ev0eJ2Wot6efPjfvb3enYzbcxXW6q2uENqgqCL4e5M8SHW8eb3DhK08W2RoHLHh0O-JoVIav3uf2bj299g4Rd9ANjz2AY070x-S7K-m42TibuI96G9zzR7vObWMshfcpGNwywOY3phuRVsvFiRZfNeATf8z7f5i0qL8S-_JHIXYnxLNOj3B_FFMaZpHKU-o9GIsST3aJAnKR15o2g4iHyYuhA0YcKMOwO4XwdNJXEvRZpL6pEKtzy-5T-pe_mHs4PpBR8HXhB4oR_7MVSQoJclfk69mA6GUZR5eQBmZ1uwXw9B8M3QhR47mZNqY2BSwNlojpPUGGhXGXPyAD6tbKH0WMFN0tILp93YqfYvFirpqQ">