// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/external/sqlite-3.33.0/sqlite3.c
// Function: exprImpliesNotNull
static int exprImpliesNotNull(
  Parse *pParse,      /* Parsing context */
  Expr *p,            /* The expression to be checked */
  Expr *pNN,          /* The expression that is NOT NULL */
  int iTab,           /* Table being evaluated */
  int seenNot         /* Return true only if p can be any non-NULL value */
){
  assert( p );
  assert( pNN );
  if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){
    return pNN->op!=TK_NULL;
  }
  switch( p->op ){
    case TK_IN: {
      if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0;
      assert( ExprHasProperty(p,EP_xIsSelect)
           || (p->x.pList!=0 && p->x.pList->nExpr>0) );
      return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
    }
    case TK_BETWEEN: {
      ExprList *pList = p->x.pList;
      assert( pList!=0 );
      assert( pList->nExpr==2 );
      if( seenNot ) return 0;
      if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1)
       || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1)
      ){
        return 1;
      }
      return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
    }
    case TK_EQ:
    case TK_NE:
    case TK_LT:
    case TK_LE:
    case TK_GT:
    case TK_GE:
    case TK_PLUS:
    case TK_MINUS:
    case TK_BITOR:
    case TK_LSHIFT:
    case TK_RSHIFT:
    case TK_CONCAT:
      seenNot = 1;
      /* no break */ deliberate_fall_through
    case TK_STAR:
    case TK_REM:
    case TK_BITAND:
    case TK_SLASH: {
      if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1;
      /* no break */ deliberate_fall_through
    }
    case TK_SPAN:
    case TK_COLLATE:
    case TK_UPLUS:
    case TK_UMINUS: {
      return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot);
    }
    case TK_TRUTH: {
      if( seenNot ) return 0;
      if( p->op2!=TK_IS ) return 0;
      return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
    }
    case TK_BITNOT:
    case TK_NOT: {
      return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1);
    }
  }
  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movl %ecx, -0x24(%rbp)
movl %r8d, -0x28(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
callq 0x42fc30
cmpl $0x0, %eax
jne 0x43075e
movq -0x20(%rbp), %rax
movzbl (%rax), %eax
cmpl $0x77, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x430935
movq -0x18(%rbp), %rax
movzbl (%rax), %eax
addl $-0x13, %eax
movl %eax, %ecx
movq %rcx, -0x38(%rbp)
subl $0x9f, %eax
ja 0x43092e
movq -0x38(%rbp), %rax
leaq 0x175398(%rip), %rcx    # 0x5a5b1c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpl $0x0, -0x28(%rbp)
je 0x4307b0
movq -0x18(%rbp), %rax
movl 0x4(%rax), %eax
andl $0x800, %eax            # imm = 0x800
cmpl $0x0, %eax
je 0x4307b0
movl $0x0, -0x4(%rbp)
jmp 0x430935
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
movl %eax, -0x4(%rbp)
jmp 0x430935
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x30(%rbp)
cmpl $0x0, -0x28(%rbp)
je 0x4307f4
movl $0x0, -0x4(%rbp)
jmp 0x430935
movq -0x10(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
cmpl $0x0, %eax
jne 0x43083a
movq -0x10(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
cmpl $0x0, %eax
je 0x430846
movl $0x1, -0x4(%rbp)
jmp 0x430935
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
movl %eax, -0x4(%rbp)
jmp 0x430935
movl $0x1, -0x28(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl -0x28(%rbp), %r8d
callq 0x430710
cmpl $0x0, %eax
je 0x4308a0
movl $0x1, -0x4(%rbp)
jmp 0x430935
jmp 0x4308a2
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl -0x28(%rbp), %r8d
callq 0x430710
movl %eax, -0x4(%rbp)
jmp 0x430935
cmpl $0x0, -0x28(%rbp)
je 0x4308d2
movl $0x0, -0x4(%rbp)
jmp 0x430935
movq -0x18(%rbp), %rax
movzbl 0x2(%rax), %eax
cmpl $0x2d, %eax
je 0x4308e8
movl $0x0, -0x4(%rbp)
jmp 0x430935
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
movl %eax, -0x4(%rbp)
jmp 0x430935
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rdx
movl -0x24(%rbp), %ecx
movl $0x1, %r8d
callq 0x430710
movl %eax, -0x4(%rbp)
jmp 0x430935
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x40, %rsp
popq %rbp
retq
nop