104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=loop-vectorize -force-vector-width=2 %s -S | FileCheck %s3 4; Test case for PR47343. Make sure LCSSA phis are create correctly when5; expanding the memory runtime checks.6 7@f.e = external global i32, align 18@d = external global ptr, align 19 10declare i1 @cond()11 12define void @f() {13; CHECK-LABEL: @f(14; CHECK-NEXT: entry:15; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]16; CHECK: outer.header:17; CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr @d, align 118; CHECK-NEXT: [[C_0:%.*]] = call i1 @cond()19; CHECK-NEXT: br i1 [[C_0]], label [[OUTER_EXIT_0:%.*]], label [[INNER_1_HEADER_PREHEADER:%.*]]20; CHECK: inner.1.header.preheader:21; CHECK-NEXT: br label [[INNER_1_HEADER:%.*]]22; CHECK: inner.1.header:23; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()24; CHECK-NEXT: br i1 [[C_1]], label [[INNER_1_LATCH:%.*]], label [[OUTER_LATCH:%.*]]25; CHECK: inner.1.latch:26; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()27; CHECK-NEXT: br i1 [[C_2]], label [[OUTER_EXIT_1:%.*]], label [[INNER_1_HEADER]]28; CHECK: outer.latch:29; CHECK-NEXT: br label [[OUTER_HEADER]]30; CHECK: outer.exit.0:31; CHECK-NEXT: br label [[LOOP_PREHEADER:%.*]]32; CHECK: outer.exit.1:33; CHECK-NEXT: br label [[LOOP_PREHEADER]]34; CHECK: loop.preheader:35; CHECK-NEXT: br label [[VECTOR_MEMCHECK:%.*]]36; CHECK: vector.memcheck:37; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP0]], i64 138; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr @f.e, [[SCEVGEP]]39; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[TMP0]], getelementptr inbounds nuw (i8, ptr @f.e, i64 4)40; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]41; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]42; CHECK: vector.ph:43; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]44; CHECK: vector.body:45; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]46; CHECK-NEXT: store i32 0, ptr @f.e, align 1, !alias.scope [[META0:![0-9]+]], !noalias [[META3:![0-9]+]]47; CHECK-NEXT: store i8 10, ptr [[TMP0]], align 1, !alias.scope [[META3]]48; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 249; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], 50050; CHECK-NEXT: br i1 [[TMP2]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]51; CHECK: middle.block:52; CHECK-NEXT: br label [[EXIT:%.*]]53; CHECK: scalar.ph:54; CHECK-NEXT: br label [[LOOP:%.*]]55; CHECK: loop:56; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[SCALAR_PH]] ]57; CHECK-NEXT: [[CONV6_US_US_US:%.*]] = zext i1 false to i3258; CHECK-NEXT: store i32 [[CONV6_US_US_US]], ptr @f.e, align 159; CHECK-NEXT: store i8 10, ptr [[TMP0]], align 160; CHECK-NEXT: [[IV_NEXT]] = add nsw i32 [[IV]], 161; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 50062; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP8:![0-9]+]]63; CHECK: exit:64; CHECK-NEXT: ret void65;66entry:67 br label %outer.header68 69outer.header: ; preds = %cleanup, %entry70 %0 = load ptr, ptr @d, align 171 %c.0 = call i1 @cond()72 br i1 %c.0, label %outer.exit.0, label %inner.1.header73 74inner.1.header: ; preds = %if.end, %for.body3.lr.ph.outer75 %c.1 = call i1 @cond()76 br i1 %c.1, label %inner.1.latch, label %outer.latch77 78inner.1.latch: ; preds = %land.end79 %c.2 = call i1 @cond()80 br i1 %c.2, label %outer.exit.1, label %inner.1.header81 82outer.latch: ; preds = %land.end83 br label %outer.header84 85 86outer.exit.0: ; preds = %if.end, %if.end.us.us.us87 br label %loop88 89outer.exit.1: ; preds = %if.end, %if.end.us.us.us90 br label %loop91 92loop: ; preds = %if.end.us.us.us, %for.body3.lr.ph.outer93 %iv = phi i32 [ %iv.next, %loop ], [ 0, %outer.exit.0 ], [ 0, %outer.exit.1 ]94 %conv6.us.us.us = zext i1 false to i3295 store i32 %conv6.us.us.us, ptr @f.e, align 196 store i8 10, ptr %0, align 197 %iv.next = add nsw i32 %iv, 198 %ec = icmp eq i32 %iv.next, 50099 br i1 %ec, label %exit, label %loop100 101exit:102 ret void103}104