1d4210800SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2d4210800SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3d4210800SFlorian Hahn 4d4210800SFlorian Hahntarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 5d4210800SFlorian Hahn 62de8f1f6SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_1(ptr %dst) { 72de8f1f6SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_1( 8d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0 9d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2 10d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1 11ee605b0aSFlorian Hahn; CHECK-NEXT: ret i1 true 12d4210800SFlorian Hahn; 13d4210800SFlorian Hahn %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0 14d4210800SFlorian Hahn %upper = getelementptr inbounds ptr, ptr %dst, i64 2 15d4210800SFlorian Hahn %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1 16d4210800SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 17d4210800SFlorian Hahn ret i1 %c.1 18d4210800SFlorian Hahn} 19d4210800SFlorian Hahn 202de8f1f6SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_2(ptr %dst) { 212de8f1f6SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_2( 222de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0 232de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 3 242de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1 25ee605b0aSFlorian Hahn; CHECK-NEXT: ret i1 true 262de8f1f6SFlorian Hahn; 272de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0 282de8f1f6SFlorian Hahn %upper = getelementptr inbounds ptr, ptr %dst, i64 3 292de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1 302de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 312de8f1f6SFlorian Hahn ret i1 %c.1 322de8f1f6SFlorian Hahn} 332de8f1f6SFlorian Hahn 34d4210800SFlorian Hahndefine i1 @test_outer_gep_last_index_overflow_all_inbounds(ptr %dst) { 35d4210800SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_overflow_all_inbounds( 36d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0 37d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2 38d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 2 39ee605b0aSFlorian Hahn; CHECK-NEXT: ret i1 false 40d4210800SFlorian Hahn; 41d4210800SFlorian Hahn %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0 42d4210800SFlorian Hahn %upper = getelementptr inbounds ptr, ptr %dst, i64 2 43d4210800SFlorian Hahn %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 2 44d4210800SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 45d4210800SFlorian Hahn ret i1 %c 46d4210800SFlorian Hahn} 47d4210800SFlorian Hahn 48d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_all_inbounds(ptr %dst) { 49d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_all_inbounds( 50d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 51d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 52d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 53*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 54d4210800SFlorian Hahn; 55d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 56d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 57d4210800SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 58d4210800SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 59d4210800SFlorian Hahn ret i1 %c 60d4210800SFlorian Hahn} 61d4210800SFlorian Hahn 62d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds(ptr %dst) { 63d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds( 64d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 65d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 66d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 67*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 68d4210800SFlorian Hahn; 69d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 70d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 71d4210800SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 72d4210800SFlorian Hahn %c = icmp uge ptr %gep.1, %dst.0 73d4210800SFlorian Hahn ret i1 %c 74d4210800SFlorian Hahn} 75d4210800SFlorian Hahn 76d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_all_inbounds(ptr %dst) { 77d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_all_inbounds( 78d4210800SFlorian Hahn; CHECK-NEXT: entry: 79d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 80d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 81d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2 82*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 false 83d4210800SFlorian Hahn; 84d4210800SFlorian Hahnentry: 85d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 86d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 87d4210800SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2 88d4210800SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 89d4210800SFlorian Hahn ret i1 %c 90d4210800SFlorian Hahn} 91d4210800SFlorian Hahn 92d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(ptr %dst) { 93d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds_2( 94d4210800SFlorian Hahn; CHECK-NEXT: entry: 95d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 96d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 97d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2 98*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 99d4210800SFlorian Hahn; 100d4210800SFlorian Hahnentry: 101d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 102d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 103d4210800SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2 104d4210800SFlorian Hahn %c = icmp uge ptr %gep.1, %dst.0 105d4210800SFlorian Hahn ret i1 %c 106d4210800SFlorian Hahn} 107d4210800SFlorian Hahn 108d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(ptr %dst) { 109d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow( 110d4210800SFlorian Hahn; CHECK-NEXT: entry: 111d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 112d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 6 113d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2 114d4210800SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 115d4210800SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 116d4210800SFlorian Hahn; 117d4210800SFlorian Hahnentry: 118d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 119d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 6 12034e477e9SFlorian Hahn %gep.1 = getelementptr i32, ptr %dst.0, i64 2 12134e477e9SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 122d4210800SFlorian Hahn ret i1 %c 123d4210800SFlorian Hahn} 124d4210800SFlorian Hahn 125d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(ptr %dst) { 126d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds( 127d4210800SFlorian Hahn; CHECK-NEXT: entry: 128d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 129d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 130d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1 131d4210800SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 132d4210800SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 133d4210800SFlorian Hahn; 134d4210800SFlorian Hahnentry: 135d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 136d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 137d4210800SFlorian Hahn %gep.1 = getelementptr i32, ptr %dst.0, i64 1 13834e477e9SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 139d4210800SFlorian Hahn ret i1 %c 140d4210800SFlorian Hahn} 141d4210800SFlorian Hahn 142d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(ptr %dst) { 143d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds( 144d4210800SFlorian Hahn; CHECK-NEXT: entry: 145d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 146d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 147d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1 148d4210800SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 149d4210800SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 150d4210800SFlorian Hahn; 151d4210800SFlorian Hahnentry: 152d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 153d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 154d4210800SFlorian Hahn %gep.1 = getelementptr i32, ptr %dst.0, i64 1 15534e477e9SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 156d4210800SFlorian Hahn ret i1 %c 157d4210800SFlorian Hahn} 158d4210800SFlorian Hahn 159d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(ptr %dst) { 160d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds( 161d4210800SFlorian Hahn; CHECK-NEXT: entry: 162d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 163d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2 164d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2 165d4210800SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 166d4210800SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 167d4210800SFlorian Hahn; 168d4210800SFlorian Hahnentry: 169d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 170d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2 17134e477e9SFlorian Hahn %gep.1 = getelementptr i32, ptr %dst.0, i64 2 17234e477e9SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 173d4210800SFlorian Hahn ret i1 %c 174d4210800SFlorian Hahn} 175d4210800SFlorian Hahn 176d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(ptr %dst) { 177d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow( 178d4210800SFlorian Hahn; CHECK-NEXT: entry: 179d4210800SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 180d4210800SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 5 181d4210800SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2 182d4210800SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 183d4210800SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 184d4210800SFlorian Hahn; 185d4210800SFlorian Hahnentry: 186d4210800SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 187d4210800SFlorian Hahn %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 5 18834e477e9SFlorian Hahn %gep.1 = getelementptr i32, ptr %dst.0, i64 2 18934e477e9SFlorian Hahn %c = icmp ult ptr %gep.1, %upper 190d4210800SFlorian Hahn ret i1 %c 191d4210800SFlorian Hahn} 1922de8f1f6SFlorian Hahn 1932de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index(ptr %dst) { 1942de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index( 1952de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0 1962de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2 1972de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1 198ee605b0aSFlorian Hahn; CHECK-NEXT: ret i1 true 1992de8f1f6SFlorian Hahn; 2002de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0 2012de8f1f6SFlorian Hahn %upper = getelementptr inbounds ptr, ptr %dst, i64 2 2022de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1 2032de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2042de8f1f6SFlorian Hahn ret i1 %c.1 2052de8f1f6SFlorian Hahn} 2062de8f1f6SFlorian Hahn 2072de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(ptr %dst) { 2082de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds( 2092de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0 2102de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2 2112de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1 212*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 2132de8f1f6SFlorian Hahn; 2142de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0 2152de8f1f6SFlorian Hahn %upper = getelementptr inbounds ptr, ptr %dst, i64 2 2162de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1 2172de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2182de8f1f6SFlorian Hahn ret i1 %c.1 2192de8f1f6SFlorian Hahn} 2202de8f1f6SFlorian Hahn 2212de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_1(ptr %dst) { 2222de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_1( 2232de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 1 2242de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2 2252de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 226*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 false 2272de8f1f6SFlorian Hahn; 2282de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 1 2292de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 2 2302de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 2312de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2322de8f1f6SFlorian Hahn ret i1 %c.1 2332de8f1f6SFlorian Hahn} 2342de8f1f6SFlorian Hahn 2352de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_2(ptr %dst) { 2362de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_2( 2372de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0 2382de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2 2392de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 240*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 false 2412de8f1f6SFlorian Hahn; 2422de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0 2432de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 2 2442de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 2452de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2462de8f1f6SFlorian Hahn ret i1 %c.1 2472de8f1f6SFlorian Hahn} 2482de8f1f6SFlorian Hahn 2492de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_3(ptr %dst) { 2502de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_3( 2512de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0 2522de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3 2532de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 254*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 false 2552de8f1f6SFlorian Hahn; 2562de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0 2572de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 3 2582de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 2592de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2602de8f1f6SFlorian Hahn ret i1 %c.1 2612de8f1f6SFlorian Hahn} 2622de8f1f6SFlorian Hahn 2632de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_4(ptr %dst) { 2642de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_4( 2652de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0 2662de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4 2672de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 268*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 2692de8f1f6SFlorian Hahn; 2702de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0 2712de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 4 2722de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 2732de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 2742de8f1f6SFlorian Hahn ret i1 %c.1 2752de8f1f6SFlorian Hahn} 2762de8f1f6SFlorian Hahn 2772de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_5(i64 %off, ptr %dst) { 2782de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_5( 2792de8f1f6SFlorian Hahn; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2 2802de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0 2812de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5 2822de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 283*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 true 2842de8f1f6SFlorian Hahn; 2852de8f1f6SFlorian Hahn %off.ult = icmp ule i64 %off, 2 2862de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0 2872de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 5 2882de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 2892de8f1f6SFlorian Hahn %c.1 = icmp ule ptr %gep.1, %upper 2902de8f1f6SFlorian Hahn ret i1 %c.1 2912de8f1f6SFlorian Hahn} 2922de8f1f6SFlorian Hahn 2932de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_6(i64 %off, ptr %dst) { 2942de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_6( 2952de8f1f6SFlorian Hahn; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2 2962de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0 2972de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5 2982de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 299*d045e23cSFlorian Hahn; CHECK-NEXT: ret i1 false 3002de8f1f6SFlorian Hahn; 3012de8f1f6SFlorian Hahn %off.ult = icmp ule i64 %off, 2 3022de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0 3032de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 5 3042de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 3052de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 3062de8f1f6SFlorian Hahn ret i1 %c.1 3072de8f1f6SFlorian Hahn} 3082de8f1f6SFlorian Hahn 3092de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_7(i64 %off, ptr %dst) { 3102de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_7( 3112de8f1f6SFlorian Hahn; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2 3122de8f1f6SFlorian Hahn; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0 3132de8f1f6SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[OFF]] 3142de8f1f6SFlorian Hahn; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1 3152de8f1f6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]] 3162de8f1f6SFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 3172de8f1f6SFlorian Hahn; 3182de8f1f6SFlorian Hahn %off.ult = icmp ule i64 %off, 2 3192de8f1f6SFlorian Hahn %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0 3202de8f1f6SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 %off 3212de8f1f6SFlorian Hahn %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1 3222de8f1f6SFlorian Hahn %c.1 = icmp ult ptr %gep.1, %upper 3232de8f1f6SFlorian Hahn ret i1 %c.1 3242de8f1f6SFlorian Hahn} 325