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