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 81; combine -x & 1 into x & 1 82define i64 @test9(i64 %x) { 83; CHECK-LABEL: @test9( 84; CHECK-NOT: %sub = sub nsw i64 0, %x 85; CHECK-NOT: %and = and i64 %sub, 1 86; CHECK-NEXT: %and = and i64 %x, 1 87; CHECK-NEXT: ret i64 %and 88 %sub = sub nsw i64 0, %x 89 %and = and i64 %sub, 1 90 ret i64 %and 91} 92 93define i64 @test10(i64 %x) { 94; CHECK-LABEL: @test10( 95; CHECK-NOT: %sub = sub nsw i64 0, %x 96; CHECK-NEXT: %and = and i64 %x, 1 97; CHECK-NOT: %add = add i64 %sub, %and 98; CHECK-NEXT: %add = sub i64 %and, %x 99; CHECK-NEXT: ret i64 %add 100 %sub = sub nsw i64 0, %x 101 %and = and i64 %sub, 1 102 %add = add i64 %sub, %and 103 ret i64 %add 104} 105 106define i64 @fabs_double(double %x) { 107; CHECK-LABEL: @fabs_double( 108; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) 109; CHECK-NEXT: %and = bitcast double %fabs to i64 110; CHECK-NEXT: ret i64 %and 111 %bc = bitcast double %x to i64 112 %and = and i64 %bc, 9223372036854775807 113 ret i64 %and 114} 115 116define i64 @fabs_double_swap(double %x) { 117; CHECK-LABEL: @fabs_double_swap( 118; CHECK-NEXT: %fabs = call double @llvm.fabs.f64(double %x) 119; CHECK-NEXT: %and = bitcast double %fabs to i64 120; CHECK-NEXT: ret i64 %and 121 %bc = bitcast double %x to i64 122 %and = and i64 9223372036854775807, %bc 123 ret i64 %and 124} 125 126define i32 @fabs_float(float %x) { 127; CHECK-LABEL: @fabs_float( 128; CHECK-NEXT: %fabs = call float @llvm.fabs.f32(float %x) 129; CHECK-NEXT: %and = bitcast float %fabs to i32 130; CHECK-NEXT: ret i32 %and 131 %bc = bitcast float %x to i32 132 %and = and i32 %bc, 2147483647 133 ret i32 %and 134} 135 136; Make sure that only a bitcast is transformed. 137 138define i64 @fabs_double_not_bitcast(double %x) { 139; CHECK-LABEL: @fabs_double_not_bitcast( 140; CHECK-NEXT: %bc = fptoui double %x to i64 141; CHECK-NEXT: %and = and i64 %bc, 9223372036854775807 142; CHECK-NEXT: ret i64 %and 143 %bc = fptoui double %x to i64 144 %and = and i64 %bc, 9223372036854775807 145 ret i64 %and 146} 147 148