The motivation is that the update script has at least two deviations (`<...>@GOT`/`<...>@PLT`/ and not hiding pointer arithmetics) from what pretty much all the checklines were generated with, and most of the tests are still not updated, so each time one of the non-up-to-date tests is updated to see the effect of the code change, there is a lot of noise. Instead of having to deal with that each time, let's just deal with everything at once. This has been done via: ``` cd llvm-project/llvm/test/CodeGen/X86 grep -rl "; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py" | xargs -L1 <...>/llvm-project/llvm/utils/update_llc_test_checks.py --llc-binary <...>/llvm-project/build/bin/llc ``` Not all tests were regenerated, however.
1175 lines
28 KiB
LLVM
1175 lines
28 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X86
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=X64
|
|
|
|
; PR3253
|
|
|
|
; The register+memory form of the BT instruction should be usable on
|
|
; pentium4, however it is currently disabled due to the register+memory
|
|
; form having different semantics than the register+register form.
|
|
|
|
; Test these patterns:
|
|
; (X & (1 << N)) != 0 --> BT(X, N).
|
|
; ((X >>u N) & 1) != 0 --> BT(X, N).
|
|
; as well as several variations:
|
|
; - The second form can use an arithmetic shift.
|
|
; - Either form can use == instead of !=.
|
|
; - Either form can compare with an operand of the &
|
|
; instead of with 0.
|
|
; - The comparison can be commuted (only cases where neither
|
|
; operand is constant are included).
|
|
; - The and can be commuted.
|
|
|
|
define void @test2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: test2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB0_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB0_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: test2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB0_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB0_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @test2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: test2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB1_1
|
|
; X86-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB1_1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: test2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB1_1
|
|
; X64-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: .LBB1_1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @atest2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: atest2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB2_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB2_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: atest2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB2_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB2_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @atest2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: atest2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB3_1
|
|
; X86-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB3_1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: atest2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB3_1
|
|
; X64-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: .LBB3_1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @test3(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: test3:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB4_1
|
|
; X86-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB4_1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: test3:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB4_1
|
|
; X64-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: .LBB4_1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @test3b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: test3b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB5_1
|
|
; X86-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB5_1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: test3b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB5_1
|
|
; X64-NEXT: # %bb.2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: .LBB5_1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @testne2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: testne2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB6_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB6_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: testne2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB6_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB6_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @testne2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: testne2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB7_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB7_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: testne2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB7_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB7_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @atestne2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: atestne2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB8_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB8_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: atestne2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB8_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB8_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @atestne2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: atestne2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB9_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB9_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: atestne2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB9_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB9_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @testne3(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: testne3:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB10_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB10_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: testne3:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB10_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB10_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @testne3b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: testne3b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB11_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB11_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: testne3b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB11_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB11_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, 0
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB12_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB12_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB12_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB12_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp eq i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB13_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB13_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB13_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB13_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @aquery2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: aquery2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB14_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB14_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: aquery2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB14_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB14_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp eq i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @aquery2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: aquery2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB15_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB15_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: aquery2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB15_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB15_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query3(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query3:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB16_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB16_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query3:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB16_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB16_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp eq i32 %tmp3, %tmp29
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query3b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query3b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB17_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB17_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query3b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB17_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB17_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp3, %tmp29
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query3x(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query3x:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB18_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB18_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query3x:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB18_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB18_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp eq i32 %tmp29, %tmp3
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @query3bx(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: query3bx:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jae .LBB19_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB19_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: query3bx:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jae .LBB19_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB19_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp eq i32 %tmp29, %tmp3
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB20_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB20_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB20_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB20_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp ne i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB21_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB21_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB21_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB21_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = lshr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @aqueryne2(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: aqueryne2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB22_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB22_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: aqueryne2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB22_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB22_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 %tmp29, 1
|
|
%tmp4 = icmp ne i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @aqueryne2b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: aqueryne2b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB23_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB23_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: aqueryne2b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB23_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB23_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = ashr i32 %x, %n
|
|
%tmp3 = and i32 1, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, 1
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne3(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne3:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB24_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB24_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne3:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB24_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB24_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp ne i32 %tmp3, %tmp29
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne3b(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne3b:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB25_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB25_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne3b:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB25_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB25_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp3, %tmp29
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne3x(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne3x:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB26_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB26_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne3x:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB26_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB26_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %tmp29, %x
|
|
%tmp4 = icmp ne i32 %tmp29, %tmp3
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
define void @queryne3bx(i32 %x, i32 %n) nounwind {
|
|
; X86-LABEL: queryne3bx:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: jb .LBB27_2
|
|
; X86-NEXT: # %bb.1: # %bb
|
|
; X86-NEXT: calll foo@PLT
|
|
; X86-NEXT: .LBB27_2: # %UnifiedReturnBlock
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: queryne3bx:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: jb .LBB27_2
|
|
; X64-NEXT: # %bb.1: # %bb
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: callq foo@PLT
|
|
; X64-NEXT: popq %rax
|
|
; X64-NEXT: .LBB27_2: # %UnifiedReturnBlock
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%tmp29 = shl i32 1, %n
|
|
%tmp3 = and i32 %x, %tmp29
|
|
%tmp4 = icmp ne i32 %tmp29, %tmp3
|
|
br i1 %tmp4, label %bb, label %UnifiedReturnBlock
|
|
|
|
bb:
|
|
call void @foo()
|
|
ret void
|
|
|
|
UnifiedReturnBlock:
|
|
ret void
|
|
}
|
|
|
|
declare void @foo()
|
|
|
|
define zeroext i1 @invert(i32 %flags, i32 %flag) nounwind {
|
|
; X86-LABEL: invert:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: notl %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: setb %al
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: invert:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: notl %edi
|
|
; X64-NEXT: btl %esi, %edi
|
|
; X64-NEXT: setb %al
|
|
; X64-NEXT: retq
|
|
%neg = xor i32 %flags, -1
|
|
%shl = shl i32 1, %flag
|
|
%and = and i32 %shl, %neg
|
|
%tobool = icmp ne i32 %and, 0
|
|
ret i1 %tobool
|
|
}
|
|
|
|
define zeroext i1 @extend(i32 %bit, i64 %bits) {
|
|
; X86-LABEL: extend:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: btl %ecx, %eax
|
|
; X86-NEXT: setb %al
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: extend:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: btl %edi, %esi
|
|
; X64-NEXT: setb %al
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%and = and i32 %bit, 31
|
|
%sh_prom = zext i32 %and to i64
|
|
%shl = shl i64 1, %sh_prom
|
|
%and1 = and i64 %shl, %bits
|
|
%tobool = icmp ne i64 %and1, 0
|
|
ret i1 %tobool
|
|
}
|
|
|
|
; TODO: BT fails to look through to demanded bits as c%32 has more than one use.
|
|
; void demanded_i32(int *a, int *b, unsigned c) {
|
|
; if ((a[c/32] >> (c % 32)) & 1)
|
|
; b[c/32] |= 1 << (c % 32);
|
|
; }
|
|
define void @demanded_i32(i32* nocapture readonly, i32* nocapture, i32) nounwind {
|
|
; X86-LABEL: demanded_i32:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movl %ecx, %eax
|
|
; X86-NEXT: shrl $5, %eax
|
|
; X86-NEXT: movl (%edx,%eax,4), %esi
|
|
; X86-NEXT: movl $1, %edx
|
|
; X86-NEXT: shll %cl, %edx
|
|
; X86-NEXT: btl %ecx, %esi
|
|
; X86-NEXT: jae .LBB30_2
|
|
; X86-NEXT: # %bb.1:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: orl %edx, (%ecx,%eax,4)
|
|
; X86-NEXT: .LBB30_2:
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: demanded_i32:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: movl %edx, %ecx
|
|
; X64-NEXT: movl %edx, %eax
|
|
; X64-NEXT: shrl $5, %eax
|
|
; X64-NEXT: movl (%rdi,%rax,4), %edi
|
|
; X64-NEXT: movl $1, %edx
|
|
; X64-NEXT: shll %cl, %edx
|
|
; X64-NEXT: btl %ecx, %edi
|
|
; X64-NEXT: jae .LBB30_2
|
|
; X64-NEXT: # %bb.1:
|
|
; X64-NEXT: orl %edx, (%rsi,%rax,4)
|
|
; X64-NEXT: .LBB30_2:
|
|
; X64-NEXT: retq
|
|
%4 = lshr i32 %2, 5
|
|
%5 = zext i32 %4 to i64
|
|
%6 = getelementptr inbounds i32, i32* %0, i64 %5
|
|
%7 = load i32, i32* %6, align 4
|
|
%8 = and i32 %2, 31
|
|
%9 = shl i32 1, %8
|
|
%10 = and i32 %7, %9
|
|
%11 = icmp eq i32 %10, 0
|
|
br i1 %11, label %16, label %12
|
|
|
|
; <label>:12:
|
|
%13 = getelementptr inbounds i32, i32* %1, i64 %5
|
|
%14 = load i32, i32* %13, align 4
|
|
%15 = or i32 %14, %9
|
|
store i32 %15, i32* %13, align 4
|
|
br label %16
|
|
|
|
; <label>:16:
|
|
ret void
|
|
}
|
|
|
|
; Make sure we can simplify bt when the shift amount has known zeros in it
|
|
; which cause the and mask to have bits removed.
|
|
define zeroext i1 @demanded_with_known_zeroes(i32 %bit, i32 %bits) {
|
|
; X86-LABEL: demanded_with_known_zeroes:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: movb {{[0-9]+}}(%esp), %al
|
|
; X86-NEXT: shlb $2, %al
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-NEXT: movzbl %al, %eax
|
|
; X86-NEXT: btl %eax, %ecx
|
|
; X86-NEXT: setb %al
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: demanded_with_known_zeroes:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: shll $2, %edi
|
|
; X64-NEXT: btl %edi, %esi
|
|
; X64-NEXT: setb %al
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%bit2 = shl i32 %bit, 2
|
|
%and = and i32 %bit2, 31
|
|
%shl = shl i32 1, %and
|
|
%and1 = and i32 %shl, %bits
|
|
%tobool = icmp ne i32 %and1, 0
|
|
ret i1 %tobool
|
|
}
|