146b05528SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 346b05528SFlorian Hahn 446b05528SFlorian Hahn; Tests for cases with explicit checks that %ptr + x >= %ptr. The information can 546b05528SFlorian Hahn; be used to determine that certain GEPs do not overflow. 646b05528SFlorian Hahn 734e477e9SFlorian Hahndefine i1 @overflow_check_1(ptr %dst) { 846b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_1( 946b05528SFlorian Hahn; CHECK-NEXT: entry: 1034e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5 1134e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 1246b05528SFlorian Hahn; CHECK-NEXT: br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]] 1346b05528SFlorian Hahn; CHECK: then: 1434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 1534e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 1646b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[TRUE_DST_4_UGE]] 1746b05528SFlorian Hahn; CHECK: else: 1846b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 1946b05528SFlorian Hahn; 2046b05528SFlorian Hahnentry: 2134e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 2234e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 2346b05528SFlorian Hahn br i1 %dst.5.uge, label %then, label %else 2446b05528SFlorian Hahn 2546b05528SFlorian Hahnthen: 2634e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 2734e477e9SFlorian Hahn %true.dst.4.uge = icmp uge ptr %dst.4, %dst 2846b05528SFlorian Hahn ret i1 %true.dst.4.uge 2946b05528SFlorian Hahn 3046b05528SFlorian Hahnelse: 3146b05528SFlorian Hahn ret i1 0 3246b05528SFlorian Hahn} 3346b05528SFlorian Hahn 3434e477e9SFlorian Hahndefine i1 @overflow_check_2_and(ptr %dst) { 3546b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_2_and( 3646b05528SFlorian Hahn; CHECK-NEXT: entry: 3734e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5 3834e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 397cf499c6SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]] 4046b05528SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 4146b05528SFlorian Hahn; CHECK: then: 4234e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 4334e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 4446b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[TRUE_DST_4_UGE]] 4546b05528SFlorian Hahn; CHECK: else: 4646b05528SFlorian Hahn; CHECK-NEXT: ret i1 true 4746b05528SFlorian Hahn; 4846b05528SFlorian Hahnentry: 4934e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 5034e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 5146b05528SFlorian Hahn %and = and i1 %dst.5.uge, %dst.5.uge 5246b05528SFlorian Hahn br i1 %and, label %then, label %else 5346b05528SFlorian Hahn 5446b05528SFlorian Hahnthen: 5534e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 5634e477e9SFlorian Hahn %true.dst.4.uge = icmp uge ptr %dst.4, %dst 5746b05528SFlorian Hahn ret i1 %true.dst.4.uge 5846b05528SFlorian Hahn 5946b05528SFlorian Hahnelse: 6046b05528SFlorian Hahn ret i1 true 6146b05528SFlorian Hahn} 6246b05528SFlorian Hahn 6334e477e9SFlorian Hahndefine i1 @overflow_check_3_and(ptr %dst) { 6446b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_3_and( 6546b05528SFlorian Hahn; CHECK-NEXT: entry: 6634e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5 6734e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 687cf499c6SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]] 6946b05528SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 7046b05528SFlorian Hahn; CHECK: then: 7134e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 7234e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 7346b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[DST_4_UGE]] 7446b05528SFlorian Hahn; CHECK: else: 7534e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 7634e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_4_UGE:%.*]] = icmp uge ptr [[ELSE_DST_4]], [[DST]] 7746b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[ELSE_DST_4_UGE]] 7846b05528SFlorian Hahn; 7946b05528SFlorian Hahnentry: 8034e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 8134e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 8246b05528SFlorian Hahn %and = and i1 %dst.5.uge, %dst.5.uge 8346b05528SFlorian Hahn br i1 %and, label %then, label %else 8446b05528SFlorian Hahn 8546b05528SFlorian Hahnthen: 8634e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 8734e477e9SFlorian Hahn %dst.4.uge = icmp uge ptr %dst.4, %dst 8846b05528SFlorian Hahn ret i1 %dst.4.uge 8946b05528SFlorian Hahn 9046b05528SFlorian Hahnelse: 9134e477e9SFlorian Hahn %else.dst.4 = getelementptr i32, ptr %dst, i64 4 9234e477e9SFlorian Hahn %else.dst.4.uge = icmp uge ptr %else.dst.4, %dst 9346b05528SFlorian Hahn ret i1 %else.dst.4.uge 9446b05528SFlorian Hahn} 9546b05528SFlorian Hahn 9634e477e9SFlorian Hahndefine i1 @overflow_check_4_and(ptr %dst) { 9746b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_4_and( 9846b05528SFlorian Hahn; CHECK-NEXT: entry: 9934e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5 10034e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 1017cf499c6SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]] 10246b05528SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 10346b05528SFlorian Hahn; CHECK: then: 10434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 10534e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 10634e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_2:%.*]] = getelementptr i32, ptr [[DST]], i64 5 10734e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_5_UGE:%.*]] = icmp uge ptr [[DST_5_2]], [[DST]] 10846b05528SFlorian Hahn; CHECK-NEXT: [[RES_0:%.*]] = xor i1 [[TRUE_DST_4_UGE]], [[TRUE_DST_5_UGE]] 10934e477e9SFlorian Hahn; CHECK-NEXT: [[DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6 11034e477e9SFlorian Hahn; CHECK-NEXT: [[C_DST_6_UGE:%.*]] = icmp uge ptr [[DST_6]], [[DST]] 11146b05528SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[RES_0]], [[C_DST_6_UGE]] 11246b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 11346b05528SFlorian Hahn; CHECK: else: 11434e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 11534e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_4_UGE:%.*]] = icmp uge ptr [[ELSE_DST_4]], [[DST]] 11634e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6 11734e477e9SFlorian Hahn; CHECK-NEXT: [[ELSE_DST_6_UGE:%.*]] = icmp uge ptr [[ELSE_DST_6]], [[DST]] 11846b05528SFlorian Hahn; CHECK-NEXT: [[ELSE_RES_0:%.*]] = xor i1 [[ELSE_DST_4_UGE]], [[ELSE_DST_6_UGE]] 11946b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[ELSE_RES_0]] 12046b05528SFlorian Hahn; 12146b05528SFlorian Hahnentry: 12234e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 12334e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 12446b05528SFlorian Hahn %and = and i1 %dst.5.uge, %dst.5.uge 12546b05528SFlorian Hahn br i1 %and, label %then, label %else 12646b05528SFlorian Hahn 12746b05528SFlorian Hahnthen: 12834e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 12934e477e9SFlorian Hahn %true.dst.4.uge = icmp uge ptr %dst.4, %dst 13034e477e9SFlorian Hahn %dst.5.2 = getelementptr i32, ptr %dst, i64 5 13134e477e9SFlorian Hahn %true.dst.5.uge = icmp uge ptr %dst.5.2, %dst 13246b05528SFlorian Hahn %res.0 = xor i1 %true.dst.4.uge, %true.dst.5.uge 13346b05528SFlorian Hahn 13434e477e9SFlorian Hahn %dst.6 = getelementptr i32, ptr %dst, i64 6 13534e477e9SFlorian Hahn %c.dst.6.uge = icmp uge ptr %dst.6, %dst 13646b05528SFlorian Hahn %res.1 = xor i1 %res.0, %c.dst.6.uge 13746b05528SFlorian Hahn 13846b05528SFlorian Hahn ret i1 %res.1 13946b05528SFlorian Hahn 14046b05528SFlorian Hahnelse: 14134e477e9SFlorian Hahn %else.dst.4 = getelementptr i32, ptr %dst, i64 4 14234e477e9SFlorian Hahn %else.dst.4.uge = icmp uge ptr %else.dst.4, %dst 14334e477e9SFlorian Hahn %else.dst.6 = getelementptr i32, ptr %dst, i64 6 14434e477e9SFlorian Hahn %else.dst.6.uge = icmp uge ptr %else.dst.6, %dst 14546b05528SFlorian Hahn %else.res.0 = xor i1 %else.dst.4.uge, %else.dst.6.uge 14646b05528SFlorian Hahn 14746b05528SFlorian Hahn ret i1 %else.res.0 14846b05528SFlorian Hahn} 14946b05528SFlorian Hahn 15034e477e9SFlorian Hahndefine i1 @overflow_check_3_or(ptr %dst) { 15146b05528SFlorian Hahn; CHECK-LABEL: @overflow_check_3_or( 15246b05528SFlorian Hahn; CHECK-NEXT: entry: 15334e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5 15434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 155*18170d0fSFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[DST_5_UGE]] 15646b05528SFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]] 15746b05528SFlorian Hahn; CHECK: then: 15834e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 15934e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 16046b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[TRUE_DST_4_UGE]] 16146b05528SFlorian Hahn; CHECK: else: 16246b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 16346b05528SFlorian Hahn; 16446b05528SFlorian Hahnentry: 16534e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 16634e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 16746b05528SFlorian Hahn %or = or i1 %dst.5.uge, %dst.5.uge 16846b05528SFlorian Hahn br i1 %or, label %then, label %else 16946b05528SFlorian Hahn 17046b05528SFlorian Hahnthen: 17134e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 17234e477e9SFlorian Hahn %true.dst.4.uge = icmp uge ptr %dst.4, %dst 17346b05528SFlorian Hahn ret i1 %true.dst.4.uge 17446b05528SFlorian Hahn 17546b05528SFlorian Hahnelse: 17646b05528SFlorian Hahn ret i1 0 17746b05528SFlorian Hahn} 17846b05528SFlorian Hahn 17934e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_1(ptr %dst, i32 %n) { 18046b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_1( 18146b05528SFlorian Hahn; CHECK-NEXT: entry: 18246b05528SFlorian Hahn; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64 18334e477e9SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]] 18434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5 18534e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]] 18634e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 18746b05528SFlorian Hahn; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]] 18846b05528SFlorian Hahn; CHECK-NEXT: br i1 [[AND_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 18946b05528SFlorian Hahn; CHECK: then: 19034e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 19134e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_ULT:%.*]] = icmp ult ptr [[DST_4]], [[UPPER]] 19234e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 19346b05528SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[TRUE_DST_4_ULT]], [[TRUE_DST_4_UGE]] 19446b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[AND]] 19546b05528SFlorian Hahn; CHECK: else: 19646b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 19746b05528SFlorian Hahn; 19846b05528SFlorian Hahnentry: 19946b05528SFlorian Hahn %n.ext = zext i32 %n to i64 20034e477e9SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext 20134e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 20234e477e9SFlorian Hahn %dst.5.ult = icmp ult ptr %dst.5, %upper 20334e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 20446b05528SFlorian Hahn %and.1 = and i1 %dst.5.ult, %dst.5.uge 20546b05528SFlorian Hahn br i1 %and.1, label %then, label %else 20646b05528SFlorian Hahn 20746b05528SFlorian Hahnthen: 20834e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 20934e477e9SFlorian Hahn %true.dst.4.ult = icmp ult ptr %dst.4, %upper 21034e477e9SFlorian Hahn %true.dst.4.uge = icmp uge ptr %dst.4, %dst 21146b05528SFlorian Hahn %and = and i1 %true.dst.4.ult, %true.dst.4.uge 21246b05528SFlorian Hahn ret i1 %and 21346b05528SFlorian Hahn 21446b05528SFlorian Hahnelse: 21546b05528SFlorian Hahn ret i1 0 21646b05528SFlorian Hahn} 21746b05528SFlorian Hahn 21834e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_2_dst6(ptr %dst, i32 %n) { 21946b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_2_dst6( 22046b05528SFlorian Hahn; CHECK-NEXT: entry: 22146b05528SFlorian Hahn; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64 22234e477e9SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]] 22334e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5 22434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]] 22534e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 22646b05528SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]] 22746b05528SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 22846b05528SFlorian Hahn; CHECK: then: 22934e477e9SFlorian Hahn; CHECK-NEXT: [[DST_6:%.*]] = getelementptr i32, ptr [[DST]], i64 6 23034e477e9SFlorian Hahn; CHECK-NEXT: [[C_DST_6_ULT:%.*]] = icmp ult ptr [[DST_6]], [[UPPER]] 23134e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_6_UGE:%.*]] = icmp uge ptr [[DST_6]], [[DST]] 23246b05528SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i1 [[C_DST_6_ULT]], [[TRUE_DST_6_UGE]] 23346b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 23446b05528SFlorian Hahn; CHECK: else: 23546b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 23646b05528SFlorian Hahn; 23746b05528SFlorian Hahnentry: 23846b05528SFlorian Hahn %n.ext = zext i32 %n to i64 23934e477e9SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext 24034e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 24134e477e9SFlorian Hahn %dst.5.ult = icmp ult ptr %dst.5, %upper 24234e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 24346b05528SFlorian Hahn %and = and i1 %dst.5.ult, %dst.5.uge 24446b05528SFlorian Hahn br i1 %and, label %then, label %else 24546b05528SFlorian Hahn 24646b05528SFlorian Hahnthen: 24734e477e9SFlorian Hahn %dst.6 = getelementptr i32, ptr %dst, i64 6 24834e477e9SFlorian Hahn %c.dst.6.ult = icmp ult ptr %dst.6, %upper 24934e477e9SFlorian Hahn %true.dst.6.uge = icmp uge ptr %dst.6, %dst 25046b05528SFlorian Hahn %res = and i1 %c.dst.6.ult, %true.dst.6.uge 25146b05528SFlorian Hahn ret i1 %res 25246b05528SFlorian Hahn 25346b05528SFlorian Hahnelse: 25446b05528SFlorian Hahn ret i1 0 25546b05528SFlorian Hahn} 25646b05528SFlorian Hahn 25734e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_2_dst7(ptr %dst, i32 %n) { 25846b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_2_dst7( 25946b05528SFlorian Hahn; CHECK-NEXT: entry: 26046b05528SFlorian Hahn; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64 26134e477e9SFlorian Hahn; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i64 [[N_EXT]] 26234e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST]], i64 5 26334e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_ULT:%.*]] = icmp ult ptr [[DST_5]], [[UPPER]] 26434e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 26546b05528SFlorian Hahn; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[DST_5_ULT]], [[DST_5_UGE]] 26646b05528SFlorian Hahn; CHECK-NEXT: br i1 [[OR_COND]], label [[THEN:%.*]], label [[ELSE:%.*]] 26746b05528SFlorian Hahn; CHECK: then: 26834e477e9SFlorian Hahn; CHECK-NEXT: [[DST_7:%.*]] = getelementptr i32, ptr [[DST]], i64 7 26934e477e9SFlorian Hahn; CHECK-NEXT: [[C_DST_7_ULT:%.*]] = icmp ult ptr [[DST_7]], [[UPPER]] 27034e477e9SFlorian Hahn; CHECK-NEXT: [[C_DST_7_UGE:%.*]] = icmp uge ptr [[DST_7]], [[DST]] 27146b05528SFlorian Hahn; CHECK-NEXT: [[RES:%.*]] = and i1 [[C_DST_7_ULT]], [[C_DST_7_UGE]] 27246b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[RES]] 27346b05528SFlorian Hahn; CHECK: else: 27446b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 27546b05528SFlorian Hahn; 27646b05528SFlorian Hahnentry: 27746b05528SFlorian Hahn %n.ext = zext i32 %n to i64 27834e477e9SFlorian Hahn %upper = getelementptr inbounds i32, ptr %dst, i64 %n.ext 27934e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 5 28034e477e9SFlorian Hahn %dst.5.ult = icmp ult ptr %dst.5, %upper 28134e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 28246b05528SFlorian Hahn %or.cond = and i1 %dst.5.ult, %dst.5.uge 28346b05528SFlorian Hahn br i1 %or.cond, label %then, label %else 28446b05528SFlorian Hahn 28546b05528SFlorian Hahnthen: 28634e477e9SFlorian Hahn %dst.7 = getelementptr i32, ptr %dst, i64 7 28734e477e9SFlorian Hahn %c.dst.7.ult = icmp ult ptr %dst.7, %upper 28834e477e9SFlorian Hahn %c.dst.7.uge = icmp uge ptr %dst.7, %dst 28946b05528SFlorian Hahn %res = and i1 %c.dst.7.ult, %c.dst.7.uge 29046b05528SFlorian Hahn ret i1 %res 29146b05528SFlorian Hahn 29246b05528SFlorian Hahnelse: 29346b05528SFlorian Hahn ret i1 0 29446b05528SFlorian Hahn} 29546b05528SFlorian Hahn 29634e477e9SFlorian Hahndefine i1 @upper_and_lower_checks_lt(ptr %dst, i32 %n) { 29746b05528SFlorian Hahn; CHECK-LABEL: @upper_and_lower_checks_lt( 29846b05528SFlorian Hahn; CHECK-NEXT: entry: 29946b05528SFlorian Hahn; CHECK-NEXT: [[N_EXT:%.*]] = zext i32 [[N:%.*]] to i64 30034e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 [[N_EXT]] 30134e477e9SFlorian Hahn; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]] 30246b05528SFlorian Hahn; CHECK-NEXT: [[N_EXT_UGE:%.*]] = icmp uge i64 [[N_EXT]], 3 30346b05528SFlorian Hahn; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[DST_5_UGE]], [[N_EXT_UGE]] 30446b05528SFlorian Hahn; CHECK-NEXT: br i1 [[OR_COND]], label [[THEN:%.*]], label [[ELSE:%.*]] 30546b05528SFlorian Hahn; CHECK: then: 30634e477e9SFlorian Hahn; CHECK-NEXT: [[DST_3:%.*]] = getelementptr i32, ptr [[DST]], i64 3 30734e477e9SFlorian Hahn; CHECK-NEXT: [[TRUE_DST_3_UGE:%.*]] = icmp uge ptr [[DST_3]], [[DST]] 30834e477e9SFlorian Hahn; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4 30934e477e9SFlorian Hahn; CHECK-NEXT: [[C_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]] 31046b05528SFlorian Hahn; CHECK-NEXT: [[RES_0:%.*]] = xor i1 [[TRUE_DST_3_UGE]], [[C_DST_4_UGE]] 31146b05528SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_0]] 31246b05528SFlorian Hahn; CHECK: else: 31346b05528SFlorian Hahn; CHECK-NEXT: ret i1 false 31446b05528SFlorian Hahn; 31546b05528SFlorian Hahnentry: 31646b05528SFlorian Hahn %n.ext = zext i32 %n to i64 31734e477e9SFlorian Hahn %dst.5 = getelementptr i32, ptr %dst, i64 %n.ext 31834e477e9SFlorian Hahn %dst.5.uge = icmp uge ptr %dst.5, %dst 31946b05528SFlorian Hahn %n.ext.uge = icmp uge i64 %n.ext, 3 32046b05528SFlorian Hahn %or.cond = and i1 %dst.5.uge, %n.ext.uge 32146b05528SFlorian Hahn br i1 %or.cond, label %then, label %else 32246b05528SFlorian Hahn 32346b05528SFlorian Hahnthen: 32434e477e9SFlorian Hahn %dst.3 = getelementptr i32, ptr %dst, i64 3 32534e477e9SFlorian Hahn %true.dst.3.uge = icmp uge ptr %dst.3, %dst 32634e477e9SFlorian Hahn %dst.4 = getelementptr i32, ptr %dst, i64 4 32734e477e9SFlorian Hahn %c.dst.4.uge = icmp uge ptr %dst.4, %dst 32846b05528SFlorian Hahn %res.0 = xor i1 %true.dst.3.uge, %c.dst.4.uge 32946b05528SFlorian Hahn ret i1 %res.0 33046b05528SFlorian Hahn 33146b05528SFlorian Hahnelse: 33246b05528SFlorian Hahn ret i1 0 33346b05528SFlorian Hahn} 334