1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 ; PR1738 4 define i1 @test1(double %X, double %Y) { 5 %tmp9 = fcmp ord double %X, 0.000000e+00 6 %tmp13 = fcmp ord double %Y, 0.000000e+00 7 %bothcond = and i1 %tmp13, %tmp9 8 ret i1 %bothcond 9 ; CHECK: fcmp ord double %Y, %X 10 } 11 12 define i1 @test2(i1 %X, i1 %Y) { 13 %a = and i1 %X, %Y 14 %b = and i1 %a, %X 15 ret i1 %b 16 ; CHECK-LABEL: @test2( 17 ; CHECK-NEXT: and i1 %X, %Y 18 ; CHECK-NEXT: ret 19 } 20 21 define i32 @test3(i32 %X, i32 %Y) { 22 %a = and i32 %X, %Y 23 %b = and i32 %Y, %a 24 ret i32 %b 25 ; CHECK-LABEL: @test3( 26 ; CHECK-NEXT: and i32 %X, %Y 27 ; CHECK-NEXT: ret 28 } 29 30 define i1 @test4(i32 %X) { 31 %a = icmp ult i32 %X, 31 32 %b = icmp slt i32 %X, 0 33 %c = and i1 %a, %b 34 ret i1 %c 35 ; CHECK-LABEL: @test4( 36 ; CHECK-NEXT: ret i1 false 37 } 38 39 ; Make sure we don't go into an infinite loop with this test 40 define <4 x i32> @test5(<4 x i32> %A) { 41 %1 = xor <4 x i32> %A, <i32 1, i32 2, i32 3, i32 4> 42 %2 = and <4 x i32> <i32 1, i32 2, i32 3, i32 4>, %1 43 ret <4 x i32> %2 44 } 45 46 ; Check that we combine "if x!=0 && x!=-1" into "if x+1u>1" 47 define i32 @test6(i64 %x) nounwind { 48 ; CHECK: @test6 49 ; CHECK-NEXT: add i64 %x, 1 50 ; CHECK-NEXT: icmp ugt i64 %x.off, 1 51 %cmp1 = icmp ne i64 %x, -1 52 %not.cmp = icmp ne i64 %x, 0 53 %.cmp1 = and i1 %cmp1, %not.cmp 54 %land.ext = zext i1 %.cmp1 to i32 55 ret i32 %land.ext 56 } 57