<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/107798>107798</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Assertion failed in User::getOperand when running opt with specific command and input file
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
khagankhan
</td>
</tr>
</table>
<pre>
When I was trying to add new pass in `InstructionCombining.cpp` by adding the following:
```
void cs6475_debug(std::string DbgString) {
if (true)
dbgs() << DbgString;
}
Instruction* cs6475_optimizer(Instruction *I) {
cs6475_debug("\nCS 6475 matcher: running now\n");
// BEGIN KHAGAN KARIMOV
// x - y + y * 2 = x + y
Value *LHS = I->getOperand(0);
Value *RHS = I->getOperand(1);
if (match(LHS, m_Sub(m_Value(X), m_Value(Y)))) {
cs6475_debug("KKK: matched the 'sub'\n");
if(match (RHS, m_Shl(m_Value(Y), m_ConstantInt(C)))){
cs6475_debug("KKK: matched the 'mul'\n");
if (C->isOne()) {
cs6475_debug("KKK: matched the 'shl 1'\n");
}
}
}
return nullptr;
}
```
The program aborted when running: `./bin/opt -O2 add.ll -S -o -`
where add.ll is:
```
define i32 @sum2(i32 %0, i32 %1) local_unnamed_addr #0 {
%3 = sub i32 %0, %1 ; a - b
%4 = shl i32 %1, 1 ; b * 2
%5 = add i32 %3, %4 ; a - b + b * 2 (which is a + b)
ret i32 %5 ; simply return a + b
}
```
I built `llvm` using:
```
cmake -GNinja -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS="llvm;clang" ../llvm -DBUILTINS_CMAKE_ARGS=-DCOMPILER_RT_ENABLE_IOS=OFF && ninja -j$(nproc)
```
The version:
`./bin/opt --version`:
```
LLVM (http://llvm.org/):
LLVM version 20.0.0git
Optimized build with assertions.
Default target: x86_64-unknown-linux-gnu
Host CPU: sandybridge
```
The crash backtrace:
```
khan22@node0:~/cs6475/llvm-project/build$ ./bin/opt -O2 add.ll -S -o -
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
opt: /users/khan22/cs6475/llvm-project/llvm/include/llvm/IR/User.h:169: llvm::Value* llvm::User::getOperand(unsigned int) const: Assertion `i < NumUserOperands && "getOperand() out of range!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: ./bin/opt -O2 add.ll -S -o -
1. Running pass "function<eager-inv>(mem2reg,instcombine<max-iterations=1;no-verify-fixpoint>,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;no-sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>)" on module "add.ll"
2. Running pass "instcombine<max-iterations=1;no-verify-fixpoint>" on function "sum2"
#0 0x00007f95a20bf920 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/users/khan22/cs6475/llvm-project/build/bin/../lib/libLLVMSupport.so.20.0git+0x20a920)
#1 0x00007f95a20bc92f llvm::sys::RunSignalHandlers() (/users/khan22/cs6475/llvm-project/build/bin/../lib/libLLVMSupport.so.20.0git+0x20792f)
#2 0x00007f95a20bca85 SignalHandler(int) Signals.cpp:0:0
#3 0x00007f95a1cc8520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00007f95a1d1c9fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
#5 0x00007f95a1cc8476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
#6 0x00007f95a1cae7f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
#7 0x00007f95a1cae71b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
#8 0x00007f95a1cbfe96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#9 0x00007f9599fa054f (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMInstCombine.so.20.0git+0x3354f)
#10 0x00007f9599fa872e cs6475_optimizer(llvm::Instruction*) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMInstCombine.so.20.0git+0x3b72e)
#11 0x00007f9599fd0f72 llvm::InstCombinerImpl::run() (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMInstCombine.so.20.0git+0x63f72)
#12 0x00007f9599fd1a5b combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::BranchProbabilityInfo*, llvm::ProfileSummaryInfo*, llvm::InstCombineOptions const&) InstructionCombining.cpp:0:0
#13 0x00007f9599fd2812 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMInstCombine.so.20.0git+0x65812)
#14 0x00007f959bdde176 llvm::detail::PassModel<llvm::Function, llvm::InstCombinePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMPasses.so.20.0git+0xd5176)
#15 0x00007f9599087baf llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMCore.so.20.0git+0x34ebaf)
#16 0x00007f95a03eb546 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMAMDGPUCodeGen.so.20.0git+0x3e7546)
#17 0x00007f9599085fe7 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMCore.so.20.0git+0x34cfe7)
#18 0x00007f95a03ea266 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMAMDGPUCodeGen.so.20.0git+0x3e6266)
#19 0x00007f9599086b95 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/users/khan22/cs6475/llvm-project/build/bin/../lib/../lib/libLLVMCore.so.20.0git+0x34db95)
#20 0x00007f95a21cfb24 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/users/khan22/cs6475/llvm-project/build/bin/../lib/libLLVMOptDriver.so.20.0git+0x2fb24)
#21 0x00007f95a21dc82d optMain (/users/khan22/cs6475/llvm-project/build/bin/../lib/libLLVMOptDriver.so.20.0git+0x3c82d)
#22 0x00007f95a1cafd90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#23 0x00007f95a1cafe40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#24 0x00005622cfbbc095 _start (./bin/opt+0x1095)
Aborted
```
When I do not use `Value *LHS` or `Value *RHS` and use operands directly as following:
```
// x - y + y * 2 = x + y
//Value *LHS = I->getOperand(0);
//Value *RHS = I->getOperand(1);
if (match(I->getOperand(0), m_Sub(m_Value(X), m_Value(Y)))) {
cs6475_debug("KKK: matched the 'sub'\n");
if(match (I->getOperand(1), m_Shl(m_Value(Y), m_ConstantInt(C)))){
cs6475_debug("KKK: matched the 'mul'\n");
if (C->isOne()) {
cs6475_debug("KKK: matched the 'shl 1'\n");
}
}
}
```
It works fine:
```
./bin/opt -O2 add.ll -S -o -
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
CS 6475 matcher: running now
KKK: matched the 'sub'
KKK: matched the 'mul'
KKK: matched the 'shl 1'
CS 6475 matcher: running now
; ModuleID = 'add.ll'
source_filename = "add.ll"
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define i32 @sum2(i32 %0, i32 %1) local_unnamed_addr #0 {
%3 = sub i32 %0, %1
%4 = shl i32 %1, 1
%5 = add i32 %3, %4
ret i32 %5
}
attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW1-TmziQ_zSaFxUuLMDAwzzgP5P4Mv_KnmRvn1wChK0dkDhJxON7uM9-JQE2eOxJnMtmd2-najKxpVar-9fd6kb0YCnpmhFyDbwx8KZXuFIbLq6fN3iN2fMGs6uYp7vr3zaEwTncYgmV2FG2hopDnKaQkS0ssZSQMghG9pxJJapEUc4mvIgpo2w9SMoSjGwY7_QKs3ZDYMbznG8pWwMnAvYU2BEY2c2P-fqV0xQmcuT63iolcbUGKJAq1eROJJXQjKbxemk-ARRC4I_rlRDSDAIUKFERgMJ2EMI0XkuAAkPsTIAz6TBwmsXAnzYfzO-OQgBFrTy8VLSg_00EQEGHAgIUzfuiHCkAEALehE2WUA_DAqtkQwRwIigqpsGCjG81hSZE4V4qCAG6AegGjmcf5vfw08foQ3QPP0WL-d3DlyOSF2jBHQRobH5HEEHgTOFLO9IQf8F5RfT87celIZhbwJmtiXooicAsBSiw-xLsVyzOrhj2V9RmMEoCFNx-XAI0gcVqWcV6eGUYAhT8p15lZtqR381I89M1LDwB6KdPnzSANZapcS6AfKk38U9CqQVr5dICLvaCbfKeYL_vBZtwJhVmas4UQMGkK95btj4tWlHl50VrUZtocKl8YKT22FdAXATGJofDt_aEcO_3nU-9YUFUJRhkVZ6XSpyIl3741r-fNgSWgq8FLiCOuVAkhVt9ljTurmUFI3sA0E1MGUA3vFTQekD6pBjkObSW0OLQ2nPdbogg7SSV586OlGSUEUgdBIFry6pAAAXmG_JsbdHms_ZXmPME56uKMVyQdIXTVECAHLuDNkCeYzxeVjHsstEsIHDGEEMLxoc49NyafJN3dprAmjauo7JD7RlqfZw21E7D3D0wN-EbtwGNgu2GJhtIJcT1TOegE0S1jDzDQNKizHetBdsF32G-OYwrmittojz_WuhTvJJvnNlJgZ8JtD7cU_YHhtb09vbL3Wp2H41vZ6vF09McONOH-6Px2cd2dPx5fjtdLT9Gi9l0dTsfL9uJyV30abaqp59-f5wBZ7ogOcGSHPGKlsvZ4mn-cL88tdPj4uE_ZpMnPQcQMgo54yTHOn0gONBOqAcbSZ7m98tVvXO0-KAXWdPJw93j_Ha2WC2eWqbzB7PXzQ0EaATQCLJa9z8AcgEKWCl4srfN2Rj5SoTUKWaPa0t-FBlWSziyz9lAa6wdZKNUqWlMUtB6DbhYm2_hfimEhrphCpE9sAf2mqp29qHJc6nxgxRuqdpALCUROt3JQUs3JRmucgUVFmuidFC_BKPVyLUq9sz4llk5ZdWLtWZVu-IjlwpOHj9rWolZuosFTdfkGzAlAssNjHHyrAROyGu4ust09YIQcG3GU6Lh-h-AbuoTs0HEKgX_gyRKY6z1A8iF3zyKOht-I43_aZRvZrw3KJrE8xaPNlFcKBEvjdUBuqkkERKgmwb984ib-EM3lCV5lZLDwHwB0M1nScRgA5xoONLeCutg1ZVfk5u7Q5q4_tQrRipmStsUUp20Q5joHK6ZRa0D63ON6lIQ3leF5tIslm0sA4R6LDUbXinIMygwWxOAhiad-jDDNCdpExCPt7NoOdPZoqAKYhhXayhIyYXSZbMOTLmPzDVVmyoeJLw4QHCEFJWyIhpTiJnWxgBmLHYUD832S4WTZ5hWRbkPEHtQZ_nHNheLdVUQprQc3-nyw4bForG9qfoBQlnF6vLYmRC8JsKi7CtwZrqQIgUSZA3QhDKpEvM8QIAzKfCLRRUR2BwiwJkOgTNmXJ9tNNtZGX0pubaZZjIxuYtmuyRbA2cSc1ZJS7Oz1EYQueF5emCQcbHFIrXklqpkYyWcpcAZN9-MwSzFLZpoYDR9M6O4lXP-XOnRZ0JK_U1bSJNsOJXKSnhRcGb27Y3nHKfSkooLIi19OJo9LXMY1g8VehfKno85yJIkVY4VseKcJ89mqFG0ZhELzJJNw2BPXLFSkJQmCsc5kQagUOcuzmDB0yrXMYxq42m_NHZDZ-z24zYx-7Vm16zqAgvtqyXHhvaLbdu2n4UeRnachcjuBKzcyfrDo6BMGXd9Muc5Cg5EAm9XXCpBcGGicdLGsYnD7z9nmpO98fA6y9O4_q2z37IqdWQOJB-gJvuhsf2CbBwi-1BVAeQMj7RKQpSd0mpRsSVdM5x_xCzNjZjBrxTcD1HWExwdC44DD_ZE1OVxjW49LM1DuxPZ5t-ekdNlNEySwEN2o1YtWpP2D-neTCRaxpGRzkXeEapuj2c6TMIsgaWObpyunmmeX7ZBOAqzpLeBdyy064_gWho9LxXe9Uc93qM-b0z8zKkfdC7jjAI_c3qc_Vech_HFPIdxj2fQ5xlnJBxdxtMJSdhHIOzwDMMM256b_TRPf-30cyZVfbNEjh3fcTz34Pc6Xu0j2QIfkVNXOIcY7l_3_MygvUyV2Eekp8qwr0pqZz6CfbkbXmJelHlzhFbsJx89F2kxcjIf9bRAR1oMsRfDJgl1oJcPX4m4aeuKrn0OgyYjnDTcb1w851SqVzRRtCCyypU0pu3NSFkVpbm1xMmGvFr5ZJ5rbmkssNjNWcbPUDwJzGTGRXGSZsoLyrDi4kmQ13s0z1omAS9IgcXzrKBKaQc9ohzrkuFGkP-qCEsacY4UGpvy4VHwGMc0p-o01aPgGc3JsiqKvV7Ra1wb8z4YgGRTR2uhQnj2vreXOrTpnSPTo2B4xoEfsZRd__0O60cM5ztJ5R1mugQFzuTEIl26jP66YPCCYT8YuokvjNOUDP1RR6eUKEybQNaQ3PGU5Kc1O2cxg-QPAaV__pEW0CoTeQx-6g07iVuD7_Xc0Q78GHdrOQP4W6r8u1CdcPE6R7kkxv1826uGbIfEnvszPPpPM8a_y4jR3fTD4-cJT8kHwl5Zk_ie2w8R_yhEvIz4HbXuzAPnE29V0FaKUlwqLk4DVC-4CJ5myV_m4UlG_B4mwZGHYzS6zMNbECbfieQPQHXOQf_W-H_DOUdo1HfO8Mg5R3HofceRcQr-_8eonvbqNA69Lpiof10zTLIYuR1dRGVc8pGWJKesf0tTvz1fkOyUS5-pku9wsjF8om9U2eZJ5hUV5_lDpcpK3dD8BJP_0_QZdSIh8E6Pds1oMMmrNWWvc8mBft-y0LknNa0NPRg1r7G2a1Puh6cyFC_VSnHenC-1Fp8oS9-i-kIEzSgRLV2sZy7-_6ffXT2UairoVyJe3V5p3-s5Z__WbZgmAUohL9UdpuyXieXoXXtioaP7mSwNL7wKQ2Ea2j2ezjFP4tpwtdLLVlJhoVbFQenv3oW4_V3a5w5vhFCSxXFihx6s-WvWvbcBhsXQ7pwXUf0W_40XdU2vUMoh4wpWkkAwsrvtJmBkQy56o4t6FLPULODte5iUCpKofAex_HbH0IUdMDXx5X0wR-t-sBvmzDZ_hwaZfnfMGb3-YQ0zv7BT5sgr5wpuuXiWMDNvWk677vtb5x956_yOx98Jj3fk3vF4x-Mdj3c83vEAzhjWdwDzqamOAfLbvpSGmeSVSMgqozlhuCAN1XH3yoFdezsGI6WE6VsqKqlMczGREjKeCUIg44IklZD6k9yxBDJesS1lKdzSPG86YAtScLEDKGCcHV6z_sqm4cOzxLlW4Q7F-fbglqjb8dsg1v8zBqyUoHGliGzE1GD7458H4Yny9yq9dtLQCfEVuR76yAtc33XCq821ixDJEuR5YZA5xI0TD7uObfthMMS2G5Ireo1s5NqhHdrIdrxw4I9Q6LgBGqbY931EgGuTAtN80Pa1Xpkeueuh7fthcJXjmOTS_EkLQoxsoZk1f3sxvRLX5lIgrtYSuHZOpZIHNoqqnFwfGgTrtj5IGTzVZNhrZYe6cjcNsrIkCc1oAhNeFJqsbtsrKwW1t19VIr_-8SbARsev1-h_AwAA__8rcRvE">