[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / pr22338.ll
blob9ab5248a94602d1eb8a14588a59c9de0ea611e20
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu | FileCheck %s --check-prefix=X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=X64
5 define i32 @fn(i32 %a0, i32 %a1) {
6 ; X86-LABEL: fn:
7 ; X86:       # %bb.0: # %entry
8 ; X86-NEXT:    pushl %ebx
9 ; X86-NEXT:    .cfi_def_cfa_offset 8
10 ; X86-NEXT:    .cfi_offset %ebx, -8
11 ; X86-NEXT:    xorl %eax, %eax
12 ; X86-NEXT:    cmpl $1, {{[0-9]+}}(%esp)
13 ; X86-NEXT:    sete %cl
14 ; X86-NEXT:    setne %al
15 ; X86-NEXT:    cmpl $1, {{[0-9]+}}(%esp)
16 ; X86-NEXT:    sete %dl
17 ; X86-NEXT:    negl %eax
18 ; X86-NEXT:    addb %cl, %cl
19 ; X86-NEXT:    movl %eax, %ebx
20 ; X86-NEXT:    shll %cl, %ebx
21 ; X86-NEXT:    addb %dl, %dl
22 ; X86-NEXT:    movl %edx, %ecx
23 ; X86-NEXT:    shll %cl, %eax
24 ; X86-NEXT:    .p2align 4, 0x90
25 ; X86-NEXT:  .LBB0_1: # %bb1
26 ; X86-NEXT:    # =>This Inner Loop Header: Depth=1
27 ; X86-NEXT:    testl %ebx, %ebx
28 ; X86-NEXT:    je .LBB0_1
29 ; X86-NEXT:  # %bb.2: # %bb2
30 ; X86-NEXT:    popl %ebx
31 ; X86-NEXT:    .cfi_def_cfa_offset 4
32 ; X86-NEXT:    retl
34 ; X64-LABEL: fn:
35 ; X64:       # %bb.0: # %entry
36 ; X64-NEXT:    xorl %eax, %eax
37 ; X64-NEXT:    cmpl $1, %edi
38 ; X64-NEXT:    sete %cl
39 ; X64-NEXT:    setne %al
40 ; X64-NEXT:    cmpl $1, %esi
41 ; X64-NEXT:    sete %dl
42 ; X64-NEXT:    negl %eax
43 ; X64-NEXT:    addb %cl, %cl
44 ; X64-NEXT:    movl %eax, %esi
45 ; X64-NEXT:    shll %cl, %esi
46 ; X64-NEXT:    addb %dl, %dl
47 ; X64-NEXT:    movl %edx, %ecx
48 ; X64-NEXT:    shll %cl, %eax
49 ; X64-NEXT:    .p2align 4, 0x90
50 ; X64-NEXT:  .LBB0_1: # %bb1
51 ; X64-NEXT:    # =>This Inner Loop Header: Depth=1
52 ; X64-NEXT:    testl %esi, %esi
53 ; X64-NEXT:    je .LBB0_1
54 ; X64-NEXT:  # %bb.2: # %bb2
55 ; X64-NEXT:    retq
56 entry:
57   %cmp1 = icmp ne i32 %a0, 1
58   %cmp2 = icmp eq i32 %a1, 1
59   %sel1 = select i1 %cmp1, i32 0, i32 2
60   %sel2 = select i1 %cmp2, i32 2, i32 0
61   %sext = sext i1 %cmp1 to i32
62   %shl1 = shl i32 %sext, %sel1
63   %shl2 = shl i32 %sext, %sel2
64   %tobool = icmp eq i32 %shl1, 0
65   br label %bb1
67 bb1:                                              ; preds = %bb1, %entry
68   br i1 %tobool, label %bb1, label %bb2
70 bb2:                                              ; preds = %bb1
71   ret i32 %shl2