1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7; Should be optimized to one and.
8define i1 @test1(i32 %a, i32 %b) {
9; CHECK-LABEL: @test1(
10; CHECK-NEXT:    [[TMP1:%.*]] = xor i32 %a, %b
11; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[TMP1]], 65280
12; CHECK-NEXT:    [[TMP:%.*]] = icmp ne i32 [[TMP2]], 0
13; CHECK-NEXT:    ret i1 [[TMP]]
14;
15  %tmp1 = and i32 %a, 65280
16  %tmp3 = and i32 %b, 65280
17  %tmp = icmp ne i32 %tmp1, %tmp3
18  ret i1 %tmp
19}
20
21define <2 x i1> @test1vec(<2 x i32> %a, <2 x i32> %b) {
22; CHECK-LABEL: @test1vec(
23; CHECK-NEXT:    [[TMP1:%.*]] = xor <2 x i32> %a, %b
24; CHECK-NEXT:    [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 65280, i32 65280>
25; CHECK-NEXT:    [[TMP:%.*]] = icmp ne <2 x i32> [[TMP2]], zeroinitializer
26; CHECK-NEXT:    ret <2 x i1> [[TMP]]
27;
28  %tmp1 = and <2 x i32> %a, <i32 65280, i32 65280>
29  %tmp3 = and <2 x i32> %b, <i32 65280, i32 65280>
30  %tmp = icmp ne <2 x i32> %tmp1, %tmp3
31  ret <2 x i1> %tmp
32}
33
34define i1 @test2(i64 %A) {
35; CHECK-LABEL: @test2(
36; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 %A to i8
37; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[TMP1]], -1
38; CHECK-NEXT:    ret i1 [[CMP]]
39;
40  %and = and i64 %A, 128
41  %cmp = icmp eq i64 %and, 0
42  ret i1 %cmp
43}
44
45define <2 x i1> @test2vec(<2 x i64> %A) {
46; CHECK-LABEL: @test2vec(
47; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i64> %A to <2 x i8>
48; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt <2 x i8> [[TMP1]], <i8 -1, i8 -1>
49; CHECK-NEXT:    ret <2 x i1> [[CMP]]
50;
51  %and = and <2 x i64> %A, <i64 128, i64 128>
52  %cmp = icmp eq <2 x i64> %and, zeroinitializer
53  ret <2 x i1> %cmp
54}
55
56define i1 @test3(i64 %A) {
57; CHECK-LABEL: @test3(
58; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 %A to i8
59; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[TMP1]], 0
60; CHECK-NEXT:    ret i1 [[CMP]]
61;
62  %and = and i64 %A, 128
63  %cmp = icmp ne i64 %and, 0
64  ret i1 %cmp
65}
66
67define <2 x i1> @test3vec(<2 x i64> %A) {
68; CHECK-LABEL: @test3vec(
69; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i64> %A to <2 x i8>
70; CHECK-NEXT:    [[CMP:%.*]] = icmp slt <2 x i8> [[TMP1]], zeroinitializer
71; CHECK-NEXT:    ret <2 x i1> [[CMP]]
72;
73  %and = and <2 x i64> %A, <i64 128, i64 128>
74  %cmp = icmp ne <2 x i64> %and, zeroinitializer
75  ret <2 x i1> %cmp
76}
77
78