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