80 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -p loop-vectorize -S %s | FileCheck %s3 4target triple = "x86_64-unknown-linux-gnu"5 6declare ptr @get()7declare i1 @cond()8 9; Make sure we can clean up the created runtime checks, if vectorization isn't10; profitable.11define void @widget(i32 %arg, i64 %arg1, ptr %src) #0 {12; CHECK-LABEL: define void @widget(13; CHECK-SAME: i32 [[ARG:%.*]], i64 [[ARG1:%.*]], ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {14; CHECK-NEXT: [[ENTRY:.*:]]15; CHECK-NEXT: br label %[[LOOP_1_HEADER:.*]]16; CHECK: [[LOOP_1_HEADER]]:17; CHECK-NEXT: br label %[[INNER_1:.*]]18; CHECK: [[INNER_1]]:19; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()20; CHECK-NEXT: br i1 [[C_1]], label %[[INNER_2:.*]], label %[[INNER_1]]21; CHECK: [[INNER_2]]:22; CHECK-NEXT: [[LOAD:%.*]] = call ptr @get()23; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()24; CHECK-NEXT: br i1 [[C_2]], label %[[LOOP_2_PREHEADER:.*]], label %[[LOOP_1_LATCH:.*]]25; CHECK: [[LOOP_2_PREHEADER]]:26; CHECK-NEXT: br label %[[LOOP_2:.*]]27; CHECK: [[LOOP_1_LATCH]]:28; CHECK-NEXT: br label %[[LOOP_1_HEADER]]29; CHECK: [[LOOP_2]]:30; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], %[[LOOP_2]] ], [ [[ARG]], %[[LOOP_2_PREHEADER]] ]31; CHECK-NEXT: [[PHI8:%.*]] = phi i32 [ [[OR:%.*]], %[[LOOP_2]] ], [ 99, %[[LOOP_2_PREHEADER]] ]32; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr i32, ptr [[SRC]], i32 [[IV]]33; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP_SRC]], align 434; CHECK-NEXT: [[OR]] = or i32 [[PHI8]], [[L]]35; CHECK-NEXT: store i32 [[OR]], ptr [[LOAD]], align 436; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 137; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 10038; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP_2]], !prof [[PROF0:![0-9]+]]39; CHECK: [[EXIT]]:40; CHECK-NEXT: ret void41;42entry:43 br label %loop.1.header44 45loop.1.header:46 br label %inner.147 48inner.1:49 %c.1 = call i1 @cond()50 br i1 %c.1, label %inner.2, label %inner.151 52inner.2:53 %load = call ptr @get()54 %c.2 = call i1 @cond()55 br i1 %c.2, label %loop.2, label %loop.1.latch56 57loop.1.latch:58 br label %loop.1.header59 60loop.2:61 %iv = phi i32 [ %arg, %inner.2 ], [ %iv.next, %loop.2 ]62 %phi8 = phi i32 [ 99, %inner.2 ], [ %or, %loop.2 ]63 %gep.src = getelementptr i32, ptr %src, i32 %iv64 %l = load i32, ptr %gep.src, align 465 %or = or i32 %phi8, %l66 store i32 %or, ptr %load, align 467 %iv.next = add i32 %iv, 168 %ec = icmp eq i32 %iv, 10069 br i1 %ec, label %exit, label %loop.2, !prof !070 71exit:72 ret void73}74 75attributes #0 = { "target-features"="+avx2" }76!0 = !{!"branch_weights", i32 89478484, i32 1879048192}77;.78; CHECK: [[PROF0]] = !{!"branch_weights", i32 89478484, i32 1879048192}79;.80