380 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s3 4define void @dependency_check_and_runtime_checks_needed_gepb_is_inbounds_iv2_step5(ptr %a, ptr %b, i64 %offset, i64 %n) {5; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_gepb_is_inbounds_iv2_step5'6; CHECK-NEXT: loop:7; CHECK-NEXT: Memory dependences are safe with run-time checks8; CHECK-NEXT: Dependences:9; CHECK-NEXT: Run-time memory checks:10; CHECK-NEXT: Check 0:11; CHECK-NEXT: Comparing group GRP0:12; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv13; CHECK-NEXT: Against group GRP1:14; CHECK-NEXT: %gep.b = getelementptr inbounds float, ptr %b, i64 %iv215; CHECK-NEXT: Check 1:16; CHECK-NEXT: Comparing group GRP0:17; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv18; CHECK-NEXT: Against group GRP2:19; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset20; CHECK-NEXT: Check 2:21; CHECK-NEXT: Comparing group GRP1:22; CHECK-NEXT: %gep.b = getelementptr inbounds float, ptr %b, i64 %iv223; CHECK-NEXT: Against group GRP2:24; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset25; CHECK-NEXT: Grouped accesses:26; CHECK-NEXT: Group GRP0:27; CHECK-NEXT: (Low: %a High: ((4 * %n) + %a))28; CHECK-NEXT: Member: {%a,+,4}<nuw><%loop>29; CHECK-NEXT: Group GRP1:30; CHECK-NEXT: (Low: %b High: (-16 + (20 * %n) + %b))31; CHECK-NEXT: Member: {%b,+,20}<%loop>32; CHECK-NEXT: Group GRP2:33; CHECK-NEXT: (Low: ((4 * %offset) + %a) High: ((4 * %offset) + (4 * %n) + %a))34; CHECK-NEXT: Member: {((4 * %offset) + %a),+,4}<%loop>35; CHECK-EMPTY:36; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.37; CHECK-NEXT: SCEV assumptions:38; CHECK-EMPTY:39; CHECK-NEXT: Expressions re-written:40;41entry:42 br label %loop43 44loop:45 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]46 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]47 %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv48 %l1 = load float, ptr %gep.a.iv, align 449 %iv.offset = add i64 %iv, %offset50 %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset51 %l2 = load float, ptr %gep.a.iv.off, align 452 %ad = fadd fast float %l1, %l253 store float %ad, ptr %gep.a.iv, align 454 %gep.b = getelementptr inbounds float, ptr %b, i64 %iv255 store float 0.0, ptr %gep.b56 %iv.next = add nuw nsw i64 %iv, 157 %iv2.next = add i64 %iv2, 558 %exitcond = icmp eq i64 %iv.next, %n59 br i1 %exitcond, label %exit, label %loop60 61exit:62 ret void63}64 65define void @dependency_check_and_runtime_checks_needed_gepb_not_inbounds_iv2_step5(ptr %a, ptr %b, i64 %offset, i64 %n) {66; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_gepb_not_inbounds_iv2_step5'67; CHECK-NEXT: loop:68; CHECK-NEXT: Memory dependences are safe with run-time checks69; CHECK-NEXT: Dependences:70; CHECK-NEXT: Run-time memory checks:71; CHECK-NEXT: Check 0:72; CHECK-NEXT: Comparing group GRP0:73; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv74; CHECK-NEXT: Against group GRP1:75; CHECK-NEXT: %gep.b = getelementptr i8, ptr %b, i64 %iv276; CHECK-NEXT: Check 1:77; CHECK-NEXT: Comparing group GRP0:78; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv79; CHECK-NEXT: Against group GRP2:80; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset81; CHECK-NEXT: Check 2:82; CHECK-NEXT: Comparing group GRP1:83; CHECK-NEXT: %gep.b = getelementptr i8, ptr %b, i64 %iv284; CHECK-NEXT: Against group GRP2:85; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset86; CHECK-NEXT: Grouped accesses:87; CHECK-NEXT: Group GRP0:88; CHECK-NEXT: (Low: %a High: ((4 * %n) + %a))89; CHECK-NEXT: Member: {%a,+,4}<nuw><%loop>90; CHECK-NEXT: Group GRP1:91; CHECK-NEXT: (Low: %b High: (-1 + (5 * %n) + %b))92; CHECK-NEXT: Member: {%b,+,5}<%loop>93; CHECK-NEXT: Group GRP2:94; CHECK-NEXT: (Low: ((4 * %offset) + %a) High: ((4 * %offset) + (4 * %n) + %a))95; CHECK-NEXT: Member: {((4 * %offset) + %a),+,4}<%loop>96; CHECK-EMPTY:97; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.98; CHECK-NEXT: SCEV assumptions:99; CHECK-NEXT: {%b,+,5}<%loop> Added Flags: <nusw>100; CHECK-EMPTY:101; CHECK-NEXT: Expressions re-written:102;103entry:104 br label %loop105 106loop:107 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]108 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]109 %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv110 %l1 = load float, ptr %gep.a.iv, align 4111 %iv.offset = add i64 %iv, %offset112 %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset113 %l2 = load float, ptr %gep.a.iv.off, align 4114 %ad = fadd fast float %l1, %l2115 store float %ad, ptr %gep.a.iv, align 4116 %gep.b = getelementptr i8, ptr %b, i64 %iv2117 store float 0.0, ptr %gep.b118 %iv.next = add nuw nsw i64 %iv, 1119 %iv2.next = add i64 %iv2, 5120 %exitcond = icmp eq i64 %iv.next, %n121 br i1 %exitcond, label %exit, label %loop122 123exit:124 ret void125}126 127define void @dependency_check_and_runtime_checks_needed_gepb_is_inbounds_iv2_step_not_constant(ptr %a, ptr %b, i64 %offset, i64 %n, i64 %s) {128; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_gepb_is_inbounds_iv2_step_not_constant'129; CHECK-NEXT: loop:130; CHECK-NEXT: Memory dependences are safe with run-time checks131; CHECK-NEXT: Dependences:132; CHECK-NEXT: Run-time memory checks:133; CHECK-NEXT: Check 0:134; CHECK-NEXT: Comparing group GRP0:135; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv136; CHECK-NEXT: Against group GRP1:137; CHECK-NEXT: %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2138; CHECK-NEXT: Check 1:139; CHECK-NEXT: Comparing group GRP0:140; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv141; CHECK-NEXT: Against group GRP2:142; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset143; CHECK-NEXT: Check 2:144; CHECK-NEXT: Comparing group GRP1:145; CHECK-NEXT: %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2146; CHECK-NEXT: Against group GRP2:147; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset148; CHECK-NEXT: Grouped accesses:149; CHECK-NEXT: Group GRP0:150; CHECK-NEXT: (Low: %a High: ((4 * %n) + %a))151; CHECK-NEXT: Member: {%a,+,4}<nuw><%loop>152; CHECK-NEXT: Group GRP1:153; CHECK-NEXT: (Low: %b High: (3 + %n + %b))154; CHECK-NEXT: Member: {%b,+,1}<%loop>155; CHECK-NEXT: Group GRP2:156; CHECK-NEXT: (Low: ((4 * %offset) + %a) High: ((4 * %offset) + (4 * %n) + %a))157; CHECK-NEXT: Member: {((4 * %offset) + %a),+,4}<%loop>158; CHECK-EMPTY:159; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.160; CHECK-NEXT: SCEV assumptions:161; CHECK-NEXT: Equal predicate: %s == 1162; CHECK-EMPTY:163; CHECK-NEXT: Expressions re-written:164; CHECK-NEXT: [PSE] %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2:165; CHECK-NEXT: {%b,+,%s}<%loop>166; CHECK-NEXT: --> {%b,+,1}<%loop>167;168entry:169 br label %loop170 171loop:172 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]173 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]174 %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv175 %l1 = load float, ptr %gep.a.iv, align 4176 %iv.offset = add i64 %iv, %offset177 %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset178 %l2 = load float, ptr %gep.a.iv.off, align 4179 %ad = fadd fast float %l1, %l2180 store float %ad, ptr %gep.a.iv, align 4181 %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2182 store float 0.0, ptr %gep.b183 %iv.next = add nuw nsw i64 %iv, 1184 %iv2.next = add i64 %iv2, %s185 %exitcond = icmp eq i64 %iv.next, %n186 br i1 %exitcond, label %exit, label %loop187 188exit:189 ret void190}191 192 193define void @dependency_check_and_runtime_checks_needed_gepb_not_inbounds_iv2_step_not_constant(ptr %a, ptr %b, i64 %offset, i64 %n, i64 %s) {194; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_gepb_not_inbounds_iv2_step_not_constant'195; CHECK-NEXT: loop:196; CHECK-NEXT: Memory dependences are safe with run-time checks197; CHECK-NEXT: Dependences:198; CHECK-NEXT: Run-time memory checks:199; CHECK-NEXT: Check 0:200; CHECK-NEXT: Comparing group GRP0:201; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv202; CHECK-NEXT: Against group GRP1:203; CHECK-NEXT: %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2204; CHECK-NEXT: Check 1:205; CHECK-NEXT: Comparing group GRP0:206; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv207; CHECK-NEXT: Against group GRP2:208; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset209; CHECK-NEXT: Check 2:210; CHECK-NEXT: Comparing group GRP1:211; CHECK-NEXT: %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2212; CHECK-NEXT: Against group GRP2:213; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset214; CHECK-NEXT: Grouped accesses:215; CHECK-NEXT: Group GRP0:216; CHECK-NEXT: (Low: %a High: ((4 * %n) + %a))217; CHECK-NEXT: Member: {%a,+,4}<nuw><%loop>218; CHECK-NEXT: Group GRP1:219; CHECK-NEXT: (Low: %b High: (3 + %n + %b))220; CHECK-NEXT: Member: {%b,+,1}<%loop>221; CHECK-NEXT: Group GRP2:222; CHECK-NEXT: (Low: ((4 * %offset) + %a) High: ((4 * %offset) + (4 * %n) + %a))223; CHECK-NEXT: Member: {((4 * %offset) + %a),+,4}<%loop>224; CHECK-EMPTY:225; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.226; CHECK-NEXT: SCEV assumptions:227; CHECK-NEXT: Equal predicate: %s == 1228; CHECK-EMPTY:229; CHECK-NEXT: Expressions re-written:230; CHECK-NEXT: [PSE] %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2:231; CHECK-NEXT: {%b,+,%s}<%loop>232; CHECK-NEXT: --> {%b,+,1}<%loop>233;234entry:235 br label %loop236 237loop:238 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]239 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]240 %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv241 %l1 = load float, ptr %gep.a.iv, align 4242 %iv.offset = add i64 %iv, %offset243 %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset244 %l2 = load float, ptr %gep.a.iv.off, align 4245 %ad = fadd fast float %l1, %l2246 store float %ad, ptr %gep.a.iv, align 4247 %gep.b = getelementptr inbounds i8, ptr %b, i64 %iv2248 store float 0.0, ptr %gep.b249 %iv.next = add nuw nsw i64 %iv, 1250 %iv2.next = add i64 %iv2, %s251 %exitcond = icmp eq i64 %iv.next, %n252 br i1 %exitcond, label %exit, label %loop253 254exit:255 ret void256}257 258define void @dependency_check_and_runtime_checks_needed_gepb_may_wrap(ptr %a, ptr %b, i64 %offset, i64 %n) {259; CHECK-LABEL: 'dependency_check_and_runtime_checks_needed_gepb_may_wrap'260; CHECK-NEXT: loop:261; CHECK-NEXT: Memory dependences are safe with run-time checks262; CHECK-NEXT: Dependences:263; CHECK-NEXT: Run-time memory checks:264; CHECK-NEXT: Check 0:265; CHECK-NEXT: Comparing group GRP0:266; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv267; CHECK-NEXT: Against group GRP1:268; CHECK-NEXT: %gep.b = getelementptr float, ptr %b, i64 %iv2269; CHECK-NEXT: Check 1:270; CHECK-NEXT: Comparing group GRP0:271; CHECK-NEXT: %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv272; CHECK-NEXT: Against group GRP2:273; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset274; CHECK-NEXT: Check 2:275; CHECK-NEXT: Comparing group GRP1:276; CHECK-NEXT: %gep.b = getelementptr float, ptr %b, i64 %iv2277; CHECK-NEXT: Against group GRP2:278; CHECK-NEXT: %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset279; CHECK-NEXT: Grouped accesses:280; CHECK-NEXT: Group GRP0:281; CHECK-NEXT: (Low: %a High: ((4 * %n) + %a))282; CHECK-NEXT: Member: {%a,+,4}<nuw><%loop>283; CHECK-NEXT: Group GRP1:284; CHECK-NEXT: (Low: %b High: (-4 + (8 * %n) + %b))285; CHECK-NEXT: Member: {%b,+,8}<%loop>286; CHECK-NEXT: Group GRP2:287; CHECK-NEXT: (Low: ((4 * %offset) + %a) High: ((4 * %offset) + (4 * %n) + %a))288; CHECK-NEXT: Member: {((4 * %offset) + %a),+,4}<%loop>289; CHECK-EMPTY:290; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.291; CHECK-NEXT: SCEV assumptions:292; CHECK-NEXT: {%b,+,8}<%loop> Added Flags: <nusw>293; CHECK-EMPTY:294; CHECK-NEXT: Expressions re-written:295;296entry:297 br label %loop298 299loop:300 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]301 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]302 %gep.a.iv = getelementptr inbounds float, ptr %a, i64 %iv303 %l1 = load float, ptr %gep.a.iv, align 4304 %iv.offset = add i64 %iv, %offset305 %gep.a.iv.off = getelementptr inbounds float, ptr %a, i64 %iv.offset306 %l2 = load float, ptr %gep.a.iv.off, align 4307 %ad = fadd fast float %l1, %l2308 store float %ad, ptr %gep.a.iv, align 4309 %gep.b = getelementptr float, ptr %b, i64 %iv2310 store float 0.0, ptr %gep.b311 %iv.next = add nuw nsw i64 %iv, 1312 %iv2.next = add i64 %iv2, 2313 %exitcond = icmp eq i64 %iv.next, %n314 br i1 %exitcond, label %exit, label %loop315 316exit:317 ret void318}319 320define void @retry_after_dep_check_with_unknown_offset(ptr %A, i32 %offset) {321; CHECK-LABEL: 'retry_after_dep_check_with_unknown_offset'322; CHECK-NEXT: loop:323; CHECK-NEXT: Memory dependences are safe with run-time checks324; CHECK-NEXT: Dependences:325; CHECK-NEXT: Run-time memory checks:326; CHECK-NEXT: Check 0:327; CHECK-NEXT: Comparing group GRP0:328; CHECK-NEXT: %A.100.iv = getelementptr { float, float }, ptr %A.100, i64 %iv329; CHECK-NEXT: Against group GRP1:330; CHECK-NEXT: %A.100.iv.offset.3 = getelementptr i8, ptr %A.100, i64 %iv.offset.3331; CHECK-NEXT: Check 1:332; CHECK-NEXT: Comparing group GRP0:333; CHECK-NEXT: %A.100.iv = getelementptr { float, float }, ptr %A.100, i64 %iv334; CHECK-NEXT: Against group GRP2:335; CHECK-NEXT: ptr %A336; CHECK-NEXT: Check 2:337; CHECK-NEXT: Comparing group GRP1:338; CHECK-NEXT: %A.100.iv.offset.3 = getelementptr i8, ptr %A.100, i64 %iv.offset.3339; CHECK-NEXT: Against group GRP2:340; CHECK-NEXT: ptr %A341; CHECK-NEXT: Grouped accesses:342; CHECK-NEXT: Group GRP0:343; CHECK-NEXT: (Low: (100 + %A) High: (96 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A))344; CHECK-NEXT: Member: {(100 + %A),+,8}<%loop>345; CHECK-NEXT: Group GRP1:346; CHECK-NEXT: (Low: (100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A) High: (96 + (16 * (zext i32 %offset to i64))<nuw><nsw> + %A))347; CHECK-NEXT: Member: {(100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A),+,8}<%loop>348; CHECK-NEXT: Group GRP2:349; CHECK-NEXT: (Low: %A High: (4 + %A))350; CHECK-NEXT: Member: %A351; CHECK-EMPTY:352; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.353; CHECK-NEXT: SCEV assumptions:354; CHECK-NEXT: {(100 + %A),+,8}<%loop> Added Flags: <nusw>355; CHECK-NEXT: {(100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A),+,8}<%loop> Added Flags: <nusw>356; CHECK-EMPTY:357; CHECK-NEXT: Expressions re-written:358;359entry:360 %A.100 = getelementptr i8, ptr %A, i64 100361 %offset.ext = zext i32 %offset to i64362 br label %loop363 364loop:365 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]366 %l.A = load float, ptr %A, align 4367 %A.100.iv = getelementptr { float, float }, ptr %A.100, i64 %iv368 store float %l.A, ptr %A.100.iv, align 8369 %iv.offset = add i64 %iv, %offset.ext370 %iv.offset.3 = shl i64 %iv.offset, 3371 %A.100.iv.offset.3 = getelementptr i8, ptr %A.100, i64 %iv.offset.3372 store float 0.0, ptr %A.100.iv.offset.3, align 4373 %iv.next = add i64 %iv, 1374 %ec = icmp eq i64 %iv.next, %offset.ext375 br i1 %ec, label %exit, label %loop376 377exit:378 ret void379}380