brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · d074116 Raw
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