1*c259a2b9SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*c259a2b9SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3*c259a2b9SFlorian Hahn 4*c259a2b9SFlorian Hahndefine i1 @test_slt() { 5*c259a2b9SFlorian Hahn; CHECK-LABEL: @test_slt( 6*c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 7*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 8*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 9*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], false 10*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], true 11*c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_4]] 12*c259a2b9SFlorian Hahn; 13*c259a2b9SFlorian Hahnentry: 14*c259a2b9SFlorian Hahn %t.0 = icmp slt i8 10, 11 15*c259a2b9SFlorian Hahn %f.0 = icmp slt i8 10, 10 16*c259a2b9SFlorian Hahn %res.1 = xor i1 %t.0, %f.0 17*c259a2b9SFlorian Hahn %f.1 = icmp slt i8 10, 9 18*c259a2b9SFlorian Hahn %res.2 = xor i1 %res.1, %f.1 19*c259a2b9SFlorian Hahn %f.2 = icmp slt i8 10, -10 20*c259a2b9SFlorian Hahn %res.3 = xor i1 %res.2, %f.2 21*c259a2b9SFlorian Hahn %t.1 = icmp slt i8 10, 11 22*c259a2b9SFlorian Hahn %res.4 = xor i1 %res.3, %t.1 23*c259a2b9SFlorian Hahn ret i1 %res.4 24*c259a2b9SFlorian Hahn} 25*c259a2b9SFlorian Hahn 26*c259a2b9SFlorian Hahndefine i1 @test_sgt() { 27*c259a2b9SFlorian Hahn; CHECK-LABEL: @test_sgt( 28*c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 29*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 30*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 31*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], false 32*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], true 33*c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_4]] 34*c259a2b9SFlorian Hahn; 35*c259a2b9SFlorian Hahnentry: 36*c259a2b9SFlorian Hahn %t.0 = icmp sgt i8 11, 10 37*c259a2b9SFlorian Hahn %f.0 = icmp sgt i8 10, 10 38*c259a2b9SFlorian Hahn %res.1 = xor i1 %t.0, %f.0 39*c259a2b9SFlorian Hahn %f.1 = icmp sgt i8 9, 10 40*c259a2b9SFlorian Hahn %res.2 = xor i1 %res.1, %f.1 41*c259a2b9SFlorian Hahn %f.2 = icmp sgt i8 -10, 10 42*c259a2b9SFlorian Hahn %res.3 = xor i1 %res.2, %f.2 43*c259a2b9SFlorian Hahn %t.1 = icmp sgt i8 -1, -2 44*c259a2b9SFlorian Hahn %res.4 = xor i1 %res.3, %t.1 45*c259a2b9SFlorian Hahn ret i1 %res.4 46*c259a2b9SFlorian Hahn} 47*c259a2b9SFlorian Hahn 48*c259a2b9SFlorian Hahn; Test cases where lhs - rhs results in constant offset. 49*c259a2b9SFlorian Hahndefine i1 @test_slt_gep_1(ptr %base) { 50*c259a2b9SFlorian Hahn; CHECK-LABEL: @test_slt_gep_1( 51*c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 52*c259a2b9SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 1 53*c259a2b9SFlorian Hahn; CHECK-NEXT: [[T_0:%.*]] = icmp slt ptr [[BASE]], [[GEP_1]] 54*c259a2b9SFlorian Hahn; CHECK-NEXT: [[GEP_0:%.*]] = getelementptr inbounds i8, ptr [[BASE]], i8 0 55*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], false 56*c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[BASE]] 57*c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]] 58*c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 59*c259a2b9SFlorian Hahn; 60*c259a2b9SFlorian Hahnentry: 61*c259a2b9SFlorian Hahn %gep.1 = getelementptr inbounds i8, ptr %base, i8 1 62*c259a2b9SFlorian Hahn %t.0 = icmp slt ptr %base, %gep.1 63*c259a2b9SFlorian Hahn %gep.0 = getelementptr inbounds i8, ptr %base, i8 0 64*c259a2b9SFlorian Hahn %f.0 = icmp slt ptr %base, %gep.0 65*c259a2b9SFlorian Hahn %res.1 = xor i1 %t.0, %f.0 66*c259a2b9SFlorian Hahn %c.1 = icmp slt ptr %gep.1, %base 67*c259a2b9SFlorian Hahn %res.2 = xor i1 %res.1, %c.1 68*c259a2b9SFlorian Hahn ret i1 %res.2 69*c259a2b9SFlorian Hahn} 70*c259a2b9SFlorian Hahn 71*c259a2b9SFlorian Hahndefine i1 @test_slt_gep_2(ptr %base) { 72*c259a2b9SFlorian Hahn; CHECK-LABEL: @test_slt_gep_2( 73*c259a2b9SFlorian Hahn; CHECK-NEXT: [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 -1 74*c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt ptr [[BASE]], [[GEP_SUB_1]] 75*c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 76*c259a2b9SFlorian Hahn; 77*c259a2b9SFlorian Hahn %gep.sub.1 = getelementptr inbounds i8, ptr %base, i8 -1 78*c259a2b9SFlorian Hahn %c.1 = icmp slt ptr %base, %gep.sub.1 79*c259a2b9SFlorian Hahn ret i1 %c.1 80*c259a2b9SFlorian Hahn} 81*c259a2b9SFlorian Hahn 82*c259a2b9SFlorian Hahndefine i1 @test_slt_gep_3(ptr %base) { 83*c259a2b9SFlorian Hahn; CHECK-LABEL: @test_slt_gep_3( 84*c259a2b9SFlorian Hahn; CHECK-NEXT: [[GEP_1_NOINBOUNDS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i8 1 85*c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt ptr [[BASE]], [[GEP_1_NOINBOUNDS]] 86*c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 87*c259a2b9SFlorian Hahn; 88*c259a2b9SFlorian Hahn %gep.1.noinbounds = getelementptr i8, ptr %base, i8 1 89*c259a2b9SFlorian Hahn %c.1 = icmp slt ptr %base, %gep.1.noinbounds 90*c259a2b9SFlorian Hahn ret i1 %c.1 91*c259a2b9SFlorian Hahn} 92