1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instsimplify < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i1 @test(i32 %a) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test( 6*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %a, -1 9*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, %rhs 10*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 11*9880d681SAndroid Build Coastguard Worker ret i1 %res 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i1 @test2(i32 %a) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %a, 1 19*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, %rhs 20*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 21*9880d681SAndroid Build Coastguard Worker ret i1 %res 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i1 @test3(i32 %a) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 26*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 27*9880d681SAndroid Build Coastguard Worker; 28*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %a, 7 29*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, %rhs 30*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 31*9880d681SAndroid Build Coastguard Worker ret i1 %res 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker@B = external global i32 35*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.assume(i1) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; Known bits without a constant 38*9880d681SAndroid Build Coastguard Workerdefine i1 @test4(i32 %a) { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4( 40*9880d681SAndroid Build Coastguard Worker; CHECK: [[B:%.*]] = load i32, i32* @B 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B_AND:%.*]] = and i32 [[B]], 1 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[B_CND:%.*]] = icmp eq i32 [[B_AND]], 1 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @llvm.assume(i1 [[B_CND]]) 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 false 45*9880d681SAndroid Build Coastguard Worker; 46*9880d681SAndroid Build Coastguard Worker %b = load i32, i32* @B 47*9880d681SAndroid Build Coastguard Worker %b.and = and i32 %b, 1 48*9880d681SAndroid Build Coastguard Worker %b.cnd = icmp eq i32 %b.and, 1 49*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %b.cnd) 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %a, %b 52*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, %rhs 53*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 54*9880d681SAndroid Build Coastguard Worker ret i1 %res 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Negative test - even number 58*9880d681SAndroid Build Coastguard Workerdefine i1 @test5(i32 %a) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5( 60*9880d681SAndroid Build Coastguard Worker; CHECK: [[RHS:%.*]] = add i32 %a, 2 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %a, [[RHS]] 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[AND]], 1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[RES]] 64*9880d681SAndroid Build Coastguard Worker; 65*9880d681SAndroid Build Coastguard Worker %rhs = add i32 %a, 2 66*9880d681SAndroid Build Coastguard Worker %and = and i32 %a, %rhs 67*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 68*9880d681SAndroid Build Coastguard Worker ret i1 %res 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i32 %a) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 73*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false 74*9880d681SAndroid Build Coastguard Worker; 75*9880d681SAndroid Build Coastguard Worker %lhs = add i32 %a, -1 76*9880d681SAndroid Build Coastguard Worker %and = and i32 %lhs, %a 77*9880d681SAndroid Build Coastguard Worker %res = icmp eq i32 %and, 1 78*9880d681SAndroid Build Coastguard Worker ret i1 %res 79*9880d681SAndroid Build Coastguard Worker} 80