1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4define i1 @test_ult() { 5; CHECK-LABEL: @test_ult( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 10, 11 8; CHECK-NEXT: [[F_0:%.*]] = icmp ult i8 10, 10 9; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 10; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 10, 9 11; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 12; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 10, -10 13; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], true 14; CHECK-NEXT: ret i1 [[RES_3]] 15; 16entry: 17 %t.0 = icmp ult i8 10, 11 18 %f.0 = icmp ult i8 10, 10 19 %res.1 = xor i1 %t.0, %f.0 20 %f.1 = icmp ult i8 10, 9 21 %res.2 = xor i1 %res.1, %f.1 22 %t.1 = icmp ult i8 10, -10 23 %res.3 = xor i1 %res.2, %t.1 24 ret i1 %res.3 25} 26 27; Test cases where lhs - rhs results in constant offset. 28define i1 @test_ult_gep_1(ptr %base) { 29; CHECK-LABEL: @test_ult_gep_1( 30; CHECK-NEXT: entry: 31; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 1 32; CHECK-NEXT: [[T_0:%.*]] = icmp ult ptr [[BASE]], [[GEP_1]] 33; CHECK-NEXT: [[GEP_0:%.*]] = getelementptr inbounds i8, ptr [[BASE]], i8 0 34; CHECK-NEXT: [[F_0:%.*]] = icmp ult ptr [[BASE]], [[GEP_0]] 35; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 36; CHECK-NEXT: [[F_1:%.*]] = icmp ult ptr [[GEP_1]], [[BASE]] 37; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 38; CHECK-NEXT: ret i1 [[RES_2]] 39; 40entry: 41 %gep.1 = getelementptr inbounds i8, ptr %base, i8 1 42 %t.0 = icmp ult ptr %base, %gep.1 43 %gep.0 = getelementptr inbounds i8, ptr %base, i8 0 44 %f.0 = icmp ult ptr %base, %gep.0 45 %res.1 = xor i1 %t.0, %f.0 46 %f.1 = icmp ult ptr %gep.1, %base 47 %res.2 = xor i1 %res.1, %f.1 48 ret i1 %res.2 49} 50 51define i1 @test_ult_gep_2(ptr %base) { 52; CHECK-LABEL: @test_ult_gep_2( 53; CHECK-NEXT: [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 -1 54; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[BASE]], [[GEP_SUB_1]] 55; CHECK-NEXT: ret i1 [[C_1]] 56; 57 %gep.sub.1 = getelementptr inbounds i8, ptr %base, i8 -1 58 %c.1 = icmp ult ptr %base, %gep.sub.1 59 ret i1 %c.1 60} 61 62define i1 @test_ult_gep_3(ptr %base) { 63; CHECK-LABEL: @test_ult_gep_3( 64; CHECK-NEXT: [[GEP_1_NOINBOUNDS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i8 1 65; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[BASE]], [[GEP_1_NOINBOUNDS]] 66; CHECK-NEXT: ret i1 [[C_1]] 67; 68 %gep.1.noinbounds = getelementptr i8, ptr %base, i8 1 69 %c.1 = icmp ult ptr %base, %gep.1.noinbounds 70 ret i1 %c.1 71} 72 73define i1 @test_eq() { 74; CHECK-LABEL: @test_eq( 75; CHECK-NEXT: entry: 76; CHECK-NEXT: [[F_0:%.*]] = icmp eq i8 10, 11 77; CHECK-NEXT: [[T_0:%.*]] = icmp eq i8 10, 10 78; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[F_0]] 79; CHECK-NEXT: [[F_1:%.*]] = icmp eq i8 10, 9 80; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]] 81; CHECK-NEXT: ret i1 [[RES_2]] 82; 83entry: 84 %f.0 = icmp eq i8 10, 11 85 %t.0 = icmp eq i8 10, 10 86 %res.1 = xor i1 %t.0, %f.0 87 %f.1 = icmp eq i8 10, 9 88 %res.2 = xor i1 %res.1, %f.1 89 ret i1 %res.2 90} 91 92define i1 @test_ne() { 93; CHECK-LABEL: @test_ne( 94; CHECK-NEXT: entry: 95; CHECK-NEXT: [[T_0:%.*]] = icmp ne i8 10, 11 96; CHECK-NEXT: [[F_0:%.*]] = icmp ne i8 10, 10 97; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[F_0]] 98; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 10, 9 99; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[T_1]] 100; CHECK-NEXT: ret i1 [[RES_2]] 101; 102entry: 103 %t.0 = icmp ne i8 10, 11 104 %f.0 = icmp ne i8 10, 10 105 %res.1 = xor i1 %t.0, %f.0 106 %t.1 = icmp ne i8 10, 9 107 %res.2 = xor i1 %res.1, %t.1 108 ret i1 %res.2 109} 110