brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 7513026 Raw
153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define i1 @gep0_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) {5; CHECK-LABEL: @gep0_and_cmp(6; CHECK-NEXT:  check.0.min:7; CHECK-NEXT:    [[SRC_C:%.*]] = getelementptr i32, ptr [[SRC:%.*]], i64 08; CHECK-NEXT:    [[MIN_C:%.*]] = getelementptr i32, ptr [[MIN:%.*]], i64 09; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 310; CHECK-NEXT:    [[GEP_3_C:%.*]] = getelementptr i32, ptr [[GEP_3]], i32 011; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp ult ptr [[SRC_C]], [[MIN_C]]12; CHECK-NEXT:    [[C_MAX_3:%.*]] = icmp ugt ptr [[GEP_3_C]], [[MAX:%.*]]13; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]]14; CHECK-NEXT:    br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]]15; CHECK:       trap:16; CHECK-NEXT:    ret i1 false17; CHECK:       checks:18; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]]19; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 false, [[C_3_MAX]]20; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 121; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 false, true22; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 223; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 false, true24; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 425; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]]26; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 false, [[C_4_MAX]]27; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]]28; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]]29; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]]30; CHECK-NEXT:    ret i1 [[RES_7]]31;32check.0.min:33  %src.c = getelementptr i32, ptr %src, i64 034  %min.c = getelementptr i32, ptr %min, i64 035 36  %gep.3 = getelementptr inbounds i32, ptr %src, i64 337  %gep.3.c = getelementptr i32, ptr %gep.3, i32 038  %c.min.0 = icmp ult ptr %src.c, %min.c39  %c.max.3 = icmp ugt ptr %gep.3.c, %max40 41  %or = or i1 %c.min.0, %c.max.342  br i1 %or, label %trap, label %checks43 44trap:45  ret i1 046 47checks:48  %c.3.min = icmp ult ptr %gep.3, %min49  %c.3.max = icmp ult ptr %gep.3, %max50  %res.1 = xor i1 %c.3.min, %c.3.max51 52  %gep.1 = getelementptr inbounds i32, ptr %src, i64 153  %c.1.min = icmp ult ptr %gep.1, %min54  %c.1.max = icmp ult ptr %gep.1, %max55  %res.2 = xor i1 %c.1.min, %c.1.max56 57  %gep.2 = getelementptr inbounds i32, ptr %src, i64 258  %c.2.min = icmp ult ptr %gep.2, %min59  %c.2.max = icmp ult ptr %gep.2, %max60  %res.3 = xor i1 %c.2.min, %c.2.max61 62  %gep.4 = getelementptr inbounds i32, ptr %src, i64 463  %c.4.min = icmp ult ptr %gep.4, %min64  %c.4.max = icmp ult ptr %gep.4, %max65  %res.4 = xor i1 %c.4.min, %c.4.max66 67  %res.5 = xor i1 %res.1, %res.268  %res.6 = xor i1 %res.5, %res.369  %res.7 = xor i1 %res.6, %res.470 71  ret i1 %res.772}73 74; Should not look through addresspacecast, because it may change the pointer75; value.76define i1 @addrspacecast_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) {77; CHECK-LABEL: @addrspacecast_and_cmp(78; CHECK-NEXT:  check.0.min:79; CHECK-NEXT:    [[SRC_C:%.*]] = addrspacecast ptr [[SRC:%.*]] to ptr addrspace(1)80; CHECK-NEXT:    [[MIN_C:%.*]] = addrspacecast ptr [[MIN:%.*]] to ptr addrspace(1)81; CHECK-NEXT:    [[MAX_C:%.*]] = addrspacecast ptr [[MAX:%.*]] to ptr addrspace(1)82; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 383; CHECK-NEXT:    [[GEP_3_C:%.*]] = addrspacecast ptr [[GEP_3]] to ptr addrspace(1)84; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp ult ptr addrspace(1) [[SRC_C]], [[MIN_C]]85; CHECK-NEXT:    [[C_MAX_3:%.*]] = icmp ugt ptr addrspace(1) [[GEP_3_C]], [[MAX_C]]86; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]]87; CHECK-NEXT:    br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]]88; CHECK:       trap:89; CHECK-NEXT:    ret i1 false90; CHECK:       checks:91; CHECK-NEXT:    [[C_3_MIN:%.*]] = icmp ult ptr [[GEP_3]], [[MIN]]92; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]]93; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_3_MIN]], [[C_3_MAX]]94; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 195; CHECK-NEXT:    [[C_1_MIN:%.*]] = icmp ult ptr [[GEP_1]], [[MIN]]96; CHECK-NEXT:    [[C_1_MAX:%.*]] = icmp ult ptr [[GEP_1]], [[MAX]]97; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_1_MIN]], [[C_1_MAX]]98; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 299; CHECK-NEXT:    [[C_2_MIN:%.*]] = icmp ult ptr [[GEP_2]], [[MIN]]100; CHECK-NEXT:    [[C_2_MAX:%.*]] = icmp ult ptr [[GEP_2]], [[MAX]]101; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_2_MIN]], [[C_2_MAX]]102; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 4103; CHECK-NEXT:    [[C_4_MIN:%.*]] = icmp ult ptr [[GEP_4]], [[MIN]]104; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]]105; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[C_4_MIN]], [[C_4_MAX]]106; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]]107; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]]108; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]]109; CHECK-NEXT:    ret i1 [[RES_7]]110;111check.0.min:112  %src.c = addrspacecast ptr %src to ptr addrspace(1)113  %min.c = addrspacecast ptr %min to ptr addrspace(1)114  %max.c = addrspacecast ptr %max to ptr addrspace(1)115 116  %gep.3 = getelementptr inbounds i32, ptr %src, i64 3117  %gep.3.c = addrspacecast ptr %gep.3 to ptr addrspace(1)118  %c.min.0 = icmp ult ptr addrspace(1) %src.c, %min.c119  %c.max.3 = icmp ugt ptr addrspace(1) %gep.3.c, %max.c120 121  %or = or i1 %c.min.0, %c.max.3122  br i1 %or, label %trap, label %checks123 124trap:125  ret i1 0126 127checks:128  %c.3.min = icmp ult ptr %gep.3, %min129  %c.3.max = icmp ult ptr %gep.3, %max130  %res.1 = xor i1 %c.3.min, %c.3.max131 132  %gep.1 = getelementptr inbounds i32, ptr %src, i64 1133  %c.1.min = icmp ult ptr %gep.1, %min134  %c.1.max = icmp ult ptr %gep.1, %max135  %res.2 = xor i1 %c.1.min, %c.1.max136 137  %gep.2 = getelementptr inbounds i32, ptr %src, i64 2138  %c.2.min = icmp ult ptr %gep.2, %min139  %c.2.max = icmp ult ptr %gep.2, %max140  %res.3 = xor i1 %c.2.min, %c.2.max141 142  %gep.4 = getelementptr inbounds i32, ptr %src, i64 4143  %c.4.min = icmp ult ptr %gep.4, %min144  %c.4.max = icmp ult ptr %gep.4, %max145  %res.4 = xor i1 %c.4.min, %c.4.max146 147  %res.5 = xor i1 %res.1, %res.2148  %res.6 = xor i1 %res.5, %res.3149  %res.7 = xor i1 %res.6, %res.4150 151  ret i1 %res.7152}153