<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 - foldICmpBinOp => Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!""
   href="https://bugs.llvm.org/show_bug.cgi?id=42962">42962</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>foldICmpBinOp => Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

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

        <tr>
          <th>OS</th>
          <td>Windows NT
          </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>Scalar Optimizations
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>bjorn.a.pettersson@ericsson.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>lebedev.ri@gmail.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Given this IR (foo.ll):

;--------------------------------------------------------------------
@f.a = internal global i16 0

define dso_local void @f() local_unnamed_addr {
entry:
  %0 = load i16, i16* @f.a
  %shr = ashr i16 %0, 1
  %shr1 = ashr i16 %shr, zext (i1 icmp ne (i16 ptrtoint (i16* @f.a to i16), i16
1) to i16)
  %and = and i16 %shr1, 1
  %tobool = icmp ne i16 %and, 0
  br i1 %tobool, label %land.rhs, label %land.end

land.rhs:
  br label %land.end

land.end:
  ret void
}
;--------------------------------------------------------------------

we hit an assertion when running instcombine.

<span class="quote">> opt -instcombine -o - foo.ll -S</span >
opt: ../include/llvm/Support/Casting.h:264: typename cast_retty<X, Y
*>::ret_type llvm::cast(Y *) [X = llvm::BinaryOperator, Y = llvm::Value]:
Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
Stack dump:
0.      Program arguments: opt -instcombine -o - foo.ll -S 
1.      Running pass 'Function Pass Manager' on module 'foo.ll'.
2.      Running pass 'Combine redundant instructions' on function '@f'
 #0 0x00000000025455a4 PrintStackTraceSignalHandler(void*) (opt+0x25455a4)
 #1 0x000000000254330e llvm::sys::RunSignalHandlers() (opt+0x254330e)
 #2 0x00000000025459a8 SignalHandler(int) (opt+0x25459a8)
 #3 0x0000003ba280f7e0 __restore_rt (/lib64/libpthread.so.0+0x3ba280f7e0)
 #4 0x0000003ba24324f5 raise (/lib64/libc.so.6+0x3ba24324f5)
 #5 0x0000003ba2433cd5 abort (/lib64/libc.so.6+0x3ba2433cd5)
 #6 0x0000003ba242b66e __assert_fail_base (/lib64/libc.so.6+0x3ba242b66e)
 #7 0x0000003ba242b730 __assert_perror_fail (/lib64/libc.so.6+0x3ba242b730)
 #8 0x00000000020d3647 llvm::InstCombiner::foldICmpBinOp(llvm::ICmpInst&)
(opt+0x20d3647)
 #9 0x00000000020d9f3b llvm::InstCombiner::visitICmpInst(llvm::ICmpInst&)
(opt+0x20d9f3b)
#10 0x00000000020640af llvm::InstCombiner::run() (opt+0x20640af)
#11 0x0000000002066491 combineInstructionsOverFunction(llvm::Function&,
llvm::InstCombineWorklist&, llvm::AAResults*, llvm::AssumptionCache&,
llvm::TargetLibraryInfo&, llvm::DominatorTree&, llvm::TargetTransformInfo
const&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*,
llvm::ProfileSummaryInfo*, bool, llvm::LoopInfo*) (opt+0x2066491)
#12 0x0000000002066cee
llvm::InstructionCombiningPass::runOnFunction(llvm::Function&) (opt+0x2066cee)
#13 0x0000000001edf873 llvm::FPPassManager::runOnFunction(llvm::Function&)
(opt+0x1edf873)
#14 0x0000000001edfb83 llvm::FPPassManager::runOnModule(llvm::Module&)
(opt+0x1edfb83)
#15 0x0000000001ee01ed llvm::legacy::PassManagerImpl::run(llvm::Module&)
(opt+0x1ee01ed)
#16 0x000000000080e9b7 main (opt+0x80e9b7)
#17 0x0000003ba241ed20 __libc_start_main (/lib64/libc.so.6+0x3ba241ed20)
#18 0x00000000007f5ff9 _start (opt+0x7f5ff9)
Abort (core dumped)


Afaict it started to happen after:

commit 72b8d41ce811fa1a20711e0619d4a5307a754e57
Author: Roman Lebedev <<a href="mailto:lebedev.ri@gmail.com">lebedev.ri@gmail.com</a>>
Date:   Mon Jul 1 15:55:15 2019 +0000

    [InstCombine] Shift amount reassociation in bittest (PR42399)

    Summary:
    Given pattern:
    `icmp eq/ne (and ((x shift Q), (y oppositeshift K))), 0`
    we should move shifts to the same hand of 'and', i.e. rewrite as
    `icmp eq/ne (and (x shift (Q+K)), y), 0`  iff `(Q+K) u< bitwidth(x)`

    It might be tempting to not restrict this to situations where we know
    we'd fold two shifts together, but i'm not sure what rules should there be
    to avoid endless combine loops.

    We pick the same shift that was originally used to shift the variable we
picked to shift:
    <a href="https://rise4fun.com/Alive/6x1v">https://rise4fun.com/Alive/6x1v</a>

    Should fix [[ <a class="bz_bug_link 
          bz_status_REOPENED "
   title="REOPENED - InstCombine: shift amount reassociation when doing bit test"
   href="show_bug.cgi?id=42399">https://bugs.llvm.org/show_bug.cgi?id=42399</a> | PR42399]].

    Reviewers: spatel, nikic, RKSimon

    Reviewed By: spatel

    Subscribers: llvm-commits

    Tags: #llvm

    Differential Revision: <a href="https://reviews.llvm.org/D63829">https://reviews.llvm.org/D63829</a>

    llvm-svn: 364791</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>