1; RUN: opt < %s -instcombine -S | FileCheck %s 2 3; PR1738 4define 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 12define 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 21define 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 30define 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 40define <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" 47define i32 @test6(i64 %x) nounwind { 48; CHECK-LABEL: @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 58define i1 @test7(i32 %i, i1 %b) { 59; CHECK-LABEL: @test7( 60; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 %i, 0 61; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], %b 62; CHECK-NEXT: ret i1 [[AND]] 63 %cmp1 = icmp slt i32 %i, 1 64 %cmp2 = icmp sgt i32 %i, -1 65 %and1 = and i1 %cmp1, %b 66 %and2 = and i1 %and1, %cmp2 67 ret i1 %and2 68} 69 70define i1 @test8(i32 %i) { 71; CHECK-LABEL: @test8( 72; CHECK-NEXT: [[DEC:%.*]] = add i32 %i, -1 73; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[DEC]], 13 74; CHECK-NEXT: ret i1 [[CMP]] 75 %cmp1 = icmp ne i32 %i, 0 76 %cmp2 = icmp ult i32 %i, 14 77 %cond = and i1 %cmp1, %cmp2 78 ret i1 %cond 79} 80