<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - opt crashes with ../lib/IR/Constants.cpp:1905: static llvm::Constant *llvm::ConstantExpr::getCompare(unsigned short, llvm::Constant *, llvm::Constant *, bool): Assertion `C1->getType() == C2->getType() && "Op types should be identical!"' failed."
   href="https://bugs.llvm.org/show_bug.cgi?id=38500">38500</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>opt crashes with ../lib/IR/Constants.cpp:1905: static llvm::Constant *llvm::ConstantExpr::getCompare(unsigned short, llvm::Constant *, llvm::Constant *, bool): Assertion `C1->getType() == C2->getType() && "Op types should be identical!"' failed.
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>new-bugs
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>new bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>mikael.holmen@ericsson.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Running 
 opt -inline -S -o - bbi-16745.ll

yields

opt: ../lib/IR/Constants.cpp:1905: static llvm::Constant
*llvm::ConstantExpr::getCompare(unsigned short, llvm::Constant *,
llvm::Constant *, bool): Assertion `C1->getType() == C2->getType() && "Op types
should be identical!"' failed.
Stack dump:
0.      Program arguments: /data/repo/llvm-patch/build-all/bin/opt -verify
-inline -S -o - bbi-16745.ll 
1.      Running pass 'CallGraph Pass Manager' on module 'bbi-16745.ll'.
#0 0x0000000002086db4 PrintStackTraceSignalHandler(void*)
(/data/repo/llvm-patch/build-all/bin/opt+0x2086db4)
#1 0x0000000002084f10 llvm::sys::RunSignalHandlers()
(/data/repo/llvm-patch/build-all/bin/opt+0x2084f10)
#2 0x0000000002087118 SignalHandler(int)
(/data/repo/llvm-patch/build-all/bin/opt+0x2087118)
#3 0x00007f2ec1966330 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x10330)
#4 0x00007f2ec0555c37 gsignal
/build/eglibc-ripdx6/eglibc-2.19/signal/../nptl/sysdeps/unix/sysv/linux/raise.c:56:0
#5 0x00007f2ec0559028 abort
/build/eglibc-ripdx6/eglibc-2.19/stdlib/abort.c:91:0
#6 0x00007f2ec054ebf6 __assert_fail_base
/build/eglibc-ripdx6/eglibc-2.19/assert/assert.c:92:0
#7 0x00007f2ec054eca2 (/lib/x86_64-linux-gnu/libc.so.6+0x2fca2)
#8 0x0000000001a3dc7a llvm::ConstantExpr::getCompare(unsigned short,
llvm::Constant*, llvm::Constant*, bool)
(/data/repo/llvm-patch/build-all/bin/opt+0x1a3dc7a)
#9 0x00000000015359d0 (anonymous
namespace)::CallAnalyzer::visitCmpInst(llvm::CmpInst&)
(/data/repo/llvm-patch/build-all/bin/opt+0x15359d0)
#10 0x000000000152f643 llvm::InstVisitor<(anonymous namespace)::CallAnalyzer,
bool>::visit(llvm::Instruction&)
(/data/repo/llvm-patch/build-all/bin/opt+0x152f643)
#11 0x000000000152c2ad (anonymous
namespace)::CallAnalyzer::analyzeCall(llvm::CallSite)
(/data/repo/llvm-patch/build-all/bin/opt+0x152c2ad)
#12 0x000000000152a966 llvm::getInlineCost(llvm::CallSite, llvm::Function*,
llvm::InlineParams const&, llvm::TargetTransformInfo&,
std::function<llvm::AssumptionCache& (llvm::Function&)>&,
llvm::Optional<llvm::function_ref<llvm::BlockFrequencyInfo& (llvm::Function&)>
<span class="quote">>, llvm::ProfileSummaryInfo*, llvm::OptimizationRemarkEmitter*)</span >
(/data/repo/llvm-patch/build-all/bin/opt+0x152a966)
#13 0x000000000152a38e llvm::getInlineCost(llvm::CallSite, llvm::InlineParams
const&, llvm::TargetTransformInfo&, std::function<llvm::AssumptionCache&
(llvm::Function&)>&,
llvm::Optional<llvm::function_ref<llvm::BlockFrequencyInfo& (llvm::Function&)>
<span class="quote">>, llvm::ProfileSummaryInfo*, llvm::OptimizationRemarkEmitter*)</span >
(/data/repo/llvm-patch/build-all/bin/opt+0x152a38e)
#14 0x0000000001bcd01a (anonymous
namespace)::SimpleInliner::getInlineCost(llvm::CallSite)
(/data/repo/llvm-patch/build-all/bin/opt+0x1bcd01a)
#15 0x0000000001bd4bbd shouldInline(llvm::CallSite,
llvm::function_ref<llvm::InlineCost (llvm::CallSite)>,
llvm::OptimizationRemarkEmitter&)
(/data/repo/llvm-patch/build-all/bin/opt+0x1bd4bbd)
#16 0x0000000001bce49c
llvm::LegacyInlinerBase::inlineCalls(llvm::CallGraphSCC&)
(/data/repo/llvm-patch/build-all/bin/opt+0x1bce49c)
#17 0x0000000001bcd412 llvm::LegacyInlinerBase::runOnSCC(llvm::CallGraphSCC&)
(/data/repo/llvm-patch/build-all/bin/opt+0x1bcd412)
#18 0x00000000014d9614 (anonymous
namespace)::CGPassManager::runOnModule(llvm::Module&)
(/data/repo/llvm-patch/build-all/bin/opt+0x14d9614)
#19 0x0000000001af927a llvm::legacy::PassManagerImpl::run(llvm::Module&)
(/data/repo/llvm-patch/build-all/bin/opt+0x1af927a)
#20 0x00000000007553b4 main (/data/repo/llvm-patch/build-all/bin/opt+0x7553b4)
#21 0x00007f2ec0540f45 __libc_start_main
/build/eglibc-ripdx6/eglibc-2.19/csu/libc-start.c:321:0
#22 0x000000000073dafd _start
(/data/repo/llvm-patch/build-all/bin/opt+0x73dafd)
Abort


Problem seems to be that when the

  %cmp = icmp eq i32 %sub.ptr.sub, 0

is analyzed by

bool CallAnalyzer::visitCmpInst(CmpInst &I) {
  Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
  // First try to handle simplified comparisons.
  if (simplifyInstruction(I, [&](SmallVectorImpl<Constant *> &COps) {
        return ConstantExpr::getCompare(I.getPredicate(), COps[0], COps[1]);
      }))
    return true;

we call simplifyInstruction above:

template <typename Callable>
bool CallAnalyzer::simplifyInstruction(Instruction &I, Callable Evaluate) {
  SmallVector<Constant *, 2> COps;
  for (Value *Op : I.operands()) {
    Constant *COp = dyn_cast<Constant>(Op);
    if (!COp)
      COp = SimplifiedValues.lookup(Op);
    if (!COp)
      return false;
    COps.push_back(COp);
  }
  auto *C = Evaluate(COps);
  if (!C)
    return false;
  SimplifiedValues[&I] = C;
  return true;
}

The loop in simplifyInstruction finds

 i16 0
and
 i32 0

in SimplifiedValues, and then ConstantExpr::getCompare pukes because the two
values have different types.

Found at current trunk, r339288 and the problem seems to be old.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>