148 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt < %s -p sccp -S | FileCheck %s3 4define i1 @result_le_count() {5; CHECK-LABEL: define i1 @result_le_count() {6; CHECK-NEXT: ret i1 true7;8 %x = call i32 @llvm.experimental.get.vector.length(i32 3, i32 4, i1 false)9 %res = icmp ule i32 %x, 310 ret i1 %res11}12 13define i1 @result_le_max_lanes(i32 %count) {14; CHECK-LABEL: define i1 @result_le_max_lanes(15; CHECK-SAME: i32 [[COUNT:%.*]]) {16; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.experimental.get.vector.length.i32(i32 [[COUNT]], i32 3, i1 false)17; CHECK-NEXT: ret i1 true18;19 %x = call i32 @llvm.experimental.get.vector.length(i32 %count, i32 3, i1 false)20 %res = icmp ule i32 %x, 321 ret i1 %res22}23 24define i1 @result_le_max_lanes_scalable(i32 %count) vscale_range(2, 4) {25; CHECK-LABEL: define i1 @result_le_max_lanes_scalable(26; CHECK-SAME: i32 [[COUNT:%.*]]) #[[ATTR0:[0-9]+]] {27; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.experimental.get.vector.length.i32(i32 [[COUNT]], i32 4, i1 true)28; CHECK-NEXT: ret i1 true29;30 %x = call i32 @llvm.experimental.get.vector.length(i32 %count, i32 4, i1 true)31 %res = icmp ule i32 %x, 1632 ret i1 %res33}34 35define i32 @count_le_max_lanes() {36; CHECK-LABEL: define i32 @count_le_max_lanes() {37; CHECK-NEXT: [[ENTRY:.*:]]38; CHECK-NEXT: br label %[[LOOP:.*]]39; CHECK: [[LOOP]]:40; CHECK-NEXT: br label %[[EXIT:.*]]41; CHECK: [[EXIT]]:42; CHECK-NEXT: ret i32 443;44entry:45 br label %loop46 47loop:48 %iv = phi i32 [4, %entry], [%iv.next, %loop]49 %x = call i32 @llvm.experimental.get.vector.length(i32 %iv, i32 4, i1 false)50 %iv.next = sub i32 %iv, %x51 %ec = icmp eq i32 %iv.next, 052 br i1 %ec, label %exit, label %loop53 54exit:55 ret i32 %x56}57 58; Can't simplify because %iv isn't <= max lanes.59define i32 @count_not_le_max_lanes() {60; CHECK-LABEL: define range(i32 0, 5) i32 @count_not_le_max_lanes() {61; CHECK-NEXT: [[ENTRY:.*]]:62; CHECK-NEXT: br label %[[LOOP:.*]]63; CHECK: [[LOOP]]:64; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 6, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]65; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.experimental.get.vector.length.i32(i32 [[IV]], i32 4, i1 false)66; CHECK-NEXT: [[IV_NEXT]] = sub i32 [[IV]], [[X]]67; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 068; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]69; CHECK: [[EXIT]]:70; CHECK-NEXT: ret i32 [[X]]71;72entry:73 br label %loop74 75loop:76 %iv = phi i32 [6, %entry], [%iv.next, %loop]77 %x = call i32 @llvm.experimental.get.vector.length(i32 %iv, i32 4, i1 false)78 %iv.next = sub i32 %iv, %x79 %ec = icmp eq i32 %iv.next, 080 br i1 %ec, label %exit, label %loop81 82exit:83 ret i32 %x84}85 86define i32 @count_le_max_lanes_scalable_known() vscale_range(4, 8) {87; CHECK-LABEL: define i32 @count_le_max_lanes_scalable_known(88; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {89; CHECK-NEXT: [[ENTRY:.*:]]90; CHECK-NEXT: br label %[[LOOP:.*]]91; CHECK: [[LOOP]]:92; CHECK-NEXT: br label %[[EXIT:.*]]93; CHECK: [[EXIT]]:94; CHECK-NEXT: ret i32 1695;96entry:97 br label %loop98 99loop:100 %iv = phi i32 [16, %entry], [%iv.next, %loop]101 %x = call i32 @llvm.experimental.get.vector.length(i32 %iv, i32 4, i1 true)102 %iv.next = sub i32 %iv, %x103 %ec = icmp eq i32 %iv.next, 0104 br i1 %ec, label %exit, label %loop105 106exit:107 ret i32 %x108}109 110; Can't simplify because %iv isn't guaranteed <= max lanes.111define i32 @count_le_max_lanes_scalable_unknown() {112; CHECK-LABEL: define range(i32 0, -1) i32 @count_le_max_lanes_scalable_unknown() {113; CHECK-NEXT: [[ENTRY:.*]]:114; CHECK-NEXT: br label %[[LOOP:.*]]115; CHECK: [[LOOP]]:116; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 16, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]117; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.experimental.get.vector.length.i32(i32 [[IV]], i32 4, i1 true)118; CHECK-NEXT: [[IV_NEXT]] = sub i32 [[IV]], [[X]]119; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 0120; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]121; CHECK: [[EXIT]]:122; CHECK-NEXT: ret i32 [[X]]123;124entry:125 br label %loop126 127loop:128 %iv = phi i32 [16, %entry], [%iv.next, %loop]129 %x = call i32 @llvm.experimental.get.vector.length(i32 %iv, i32 4, i1 true)130 %iv.next = sub i32 %iv, %x131 %ec = icmp eq i32 %iv.next, 0132 br i1 %ec, label %exit, label %loop133 134exit:135 ret i32 %x136}137 138define i1 @result_le_overflow() {139; CHECK-LABEL: define i1 @result_le_overflow() {140; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 4294967296, i32 4, i1 false)141; CHECK-NEXT: [[RES:%.*]] = icmp ule i32 [[X]], 3142; CHECK-NEXT: ret i1 [[RES]]143;144 %x = call i32 @llvm.experimental.get.vector.length(i64 u0x100000000, i32 4, i1 false)145 %res = icmp ule i32 %x, 3146 ret i1 %res147}148