1aba2085eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2aba2085eSFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3aba2085eSFlorian Hahn 4aba2085eSFlorian Hahndeclare void @llvm.assume(i1) 5aba2085eSFlorian Hahn 6aba2085eSFlorian Hahndefine i1 @test(i8 %x, i8 %y) { 7aba2085eSFlorian Hahn; CHECK-LABEL: @test( 8aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i8 [[X:%.*]], [[Y:%.*]] 9aba2085eSFlorian Hahn; CHECK-NEXT: [[CMP_0:%.*]] = icmp uge i8 [[ADD]], 10 10aba2085eSFlorian Hahn; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_0]]) 11aba2085eSFlorian Hahn; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[X]] to i16 12aba2085eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge i16 [[EXT]], 1 137f3ff9d3SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = xor i1 true, [[C_1]] 14aba2085eSFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 15aba2085eSFlorian Hahn; 16aba2085eSFlorian Hahn %add = add nuw nsw i8 %x, %y 17aba2085eSFlorian Hahn %cmp.0 = icmp uge i8 %add, 10 18aba2085eSFlorian Hahn tail call void @llvm.assume(i1 %cmp.0) 19aba2085eSFlorian Hahn %ext = zext i8 %x to i16 20aba2085eSFlorian Hahn %t.1 = icmp uge i16 %ext, 0 21aba2085eSFlorian Hahn %c.1 = icmp uge i16 %ext, 1 22aba2085eSFlorian Hahn %res = xor i1 %t.1, %c.1 23aba2085eSFlorian Hahn ret i1 %res 24aba2085eSFlorian Hahn} 25aba2085eSFlorian Hahn 26aba2085eSFlorian Hahndefine i1 @test2(i8 %x, i8 %y) { 27aba2085eSFlorian Hahn; CHECK-LABEL: @test2( 28aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i8 [[X:%.*]], [[Y:%.*]] 29aba2085eSFlorian Hahn; CHECK-NEXT: [[CMP_0:%.*]] = icmp uge i8 [[ADD]], 0 30aba2085eSFlorian Hahn; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP_0]]) 31aba2085eSFlorian Hahn; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[X]] to i16 32aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i16 [[EXT]], 1 33aba2085eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge i16 [[ADD_1]], 2 347f3ff9d3SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]] 357f3ff9d3SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 36aba2085eSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i16 [[ADD_1]], 1 37aba2085eSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_2]] 38aba2085eSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_3]] 39aba2085eSFlorian Hahn; 40aba2085eSFlorian Hahn %add = add nuw nsw i8 %x, %y 41aba2085eSFlorian Hahn %cmp.0 = icmp uge i8 %add, 0 42aba2085eSFlorian Hahn tail call void @llvm.assume(i1 %cmp.0) 43aba2085eSFlorian Hahn %ext = zext i8 %x to i16 44aba2085eSFlorian Hahn %add.1 = add nuw nsw i16 %ext, 1 45aba2085eSFlorian Hahn %t.1 = icmp uge i16 %add.1, 1 46aba2085eSFlorian Hahn %c.1 = icmp uge i16 %add.1, 2 47aba2085eSFlorian Hahn %f.1 = icmp ult i16 %add.1, 1 48aba2085eSFlorian Hahn %res.1 = xor i1 %t.1, %c.1 49aba2085eSFlorian Hahn %res.2 = xor i1 %res.1, %f.1 50aba2085eSFlorian Hahn %c.2 = icmp sge i16 %add.1, 1 51aba2085eSFlorian Hahn %res.3 = xor i1 %res.2, %c.2 52aba2085eSFlorian Hahn ret i1 %res.3 53aba2085eSFlorian Hahn} 54aba2085eSFlorian Hahn 55aba2085eSFlorian Hahndefine i1 @gep_zext_idx(ptr %p, i8 %cnt, i8 %off) { 56aba2085eSFlorian Hahn; CHECK-LABEL: @gep_zext_idx( 57aba2085eSFlorian Hahn; CHECK-NEXT: entry: 58aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i8 [[CNT:%.*]], [[OFF:%.*]] 59aba2085eSFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[ADD]], 10 60aba2085eSFlorian Hahn; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) 61aba2085eSFlorian Hahn; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[CNT]] to i16 62aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i16 [[EXT]] 63aba2085eSFlorian Hahn; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds i32, ptr [[P]], i16 11 64aba2085eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ugt ptr [[ADD_PTR]], [[GEP_11]] 657f3ff9d3SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 66aba2085eSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]] 67aba2085eSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 68aba2085eSFlorian Hahn; 69aba2085eSFlorian Hahnentry: 70aba2085eSFlorian Hahn %add = add nuw nsw i8 %cnt, %off 71aba2085eSFlorian Hahn %cmp = icmp ugt i8 %add, 10 72aba2085eSFlorian Hahn tail call void @llvm.assume(i1 %cmp) 73aba2085eSFlorian Hahn %ext = zext i8 %cnt to i16 74aba2085eSFlorian Hahn %add.ptr = getelementptr inbounds i32, ptr %p, i16 %ext 75aba2085eSFlorian Hahn %t.1 = icmp uge ptr %add.ptr, %p 76aba2085eSFlorian Hahn %f.1 = icmp ult ptr %add.ptr, %p 77aba2085eSFlorian Hahn %gep.11 = getelementptr inbounds i32, ptr %p, i16 11 78aba2085eSFlorian Hahn %c.1 = icmp ugt ptr %add.ptr, %gep.11 79aba2085eSFlorian Hahn %res.1 = xor i1 %t.1, %f.1 80aba2085eSFlorian Hahn %res.2 = xor i1 %res.1, %c.1 81aba2085eSFlorian Hahn ret i1 %res.2 82aba2085eSFlorian Hahn} 83aba2085eSFlorian Hahn 84aba2085eSFlorian Hahndefine i1 @gep_zext_idx_adds(ptr %p, i8 %cnt, i8 %off) { 85aba2085eSFlorian Hahn; CHECK-LABEL: @gep_zext_idx_adds( 86aba2085eSFlorian Hahn; CHECK-NEXT: entry: 87aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i8 [[CNT:%.*]], [[OFF:%.*]] 88aba2085eSFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[ADD]], 10 89aba2085eSFlorian Hahn; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) 90aba2085eSFlorian Hahn; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[CNT]] to i16 91aba2085eSFlorian Hahn; CHECK-NEXT: [[EXT_1:%.*]] = add nuw nsw i16 [[EXT]], 1 92aba2085eSFlorian Hahn; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i16 [[EXT_1]] 93aba2085eSFlorian Hahn; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds i32, ptr [[P]], i16 11 94aba2085eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge ptr [[ADD_PTR]], [[GEP_11]] 95*8a5d51b0SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 96aba2085eSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]] 97aba2085eSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 98aba2085eSFlorian Hahn; 99aba2085eSFlorian Hahnentry: 100aba2085eSFlorian Hahn %add = add nuw nsw i8 %cnt, %off 101aba2085eSFlorian Hahn %cmp = icmp uge i8 %add, 10 102aba2085eSFlorian Hahn tail call void @llvm.assume(i1 %cmp) 103aba2085eSFlorian Hahn %ext = zext i8 %cnt to i16 104aba2085eSFlorian Hahn %ext.1 = add nuw nsw i16 %ext, 1 105aba2085eSFlorian Hahn %add.ptr = getelementptr inbounds i32, ptr %p, i16 %ext.1 106aba2085eSFlorian Hahn %t.1 = icmp uge ptr %add.ptr, %p 107aba2085eSFlorian Hahn %f.1 = icmp ult ptr %add.ptr, %p 108aba2085eSFlorian Hahn %gep.11 = getelementptr inbounds i32, ptr %p, i16 11 109aba2085eSFlorian Hahn %c.1 = icmp uge ptr %add.ptr, %gep.11 110aba2085eSFlorian Hahn %res.1 = xor i1 %t.1, %f.1 111aba2085eSFlorian Hahn %res.2 = xor i1 %res.1, %c.1 112aba2085eSFlorian Hahn ret i1 %res.2 113aba2085eSFlorian Hahn} 114