brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · df78f3d Raw
164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes="default<O3>" -S < %s  | FileCheck %s --check-prefixes=ALL,O33; RUN: opt -passes='default<O2>' -S < %s  | FileCheck %s --check-prefixes=ALL,O24; RUN: opt -passes='default<O1>' -S < %s  | FileCheck %s --check-prefixes=ALL,O15 6; All these tests should optimize to a single comparison7; of the original argument with null. There should be no loops.8 9%struct.node = type { ptr, i32 }10 11define dso_local zeroext i1 @is_not_empty_variant1(ptr %p) {12; ALL-LABEL: @is_not_empty_variant1(13; ALL-NEXT:  entry:14; ALL-NEXT:    [[TOBOOL_NOT3_I:%.*]] = icmp ne ptr [[P:%.*]], null15; ALL-NEXT:    ret i1 [[TOBOOL_NOT3_I]]16;17entry:18  %p.addr = alloca ptr, align 819  store ptr %p, ptr %p.addr, align 820  %0 = load ptr, ptr %p.addr, align 821  %call = call i32 @count_nodes_variant1(ptr %0)22  %cmp = icmp sgt i32 %call, 023  ret i1 %cmp24}25 26define internal i32 @count_nodes_variant1(ptr %p) {27entry:28  %p.addr = alloca ptr, align 829  %size = alloca i32, align 430  store ptr %p, ptr %p.addr, align 831  store i32 0, ptr %size, align 432  br label %while.cond33 34while.cond:35  %0 = load ptr, ptr %p.addr, align 836  %tobool = icmp ne ptr %0, null37  br i1 %tobool, label %while.body, label %while.end38 39while.body:40  %1 = load ptr, ptr %p.addr, align 841  %2 = load ptr, ptr %1, align 842  store ptr %2, ptr %p.addr, align 843  %3 = load i32, ptr %size, align 444  %inc = add nsw i32 %3, 145  store i32 %inc, ptr %size, align 446  br label %while.cond, !llvm.loop !047 48while.end:49  %4 = load i32, ptr %size, align 450  ret i32 %451}52 53define dso_local zeroext i1 @is_not_empty_variant2(ptr %p) {54; ALL-LABEL: @is_not_empty_variant2(55; ALL-NEXT:  entry:56; ALL-NEXT:    [[TOBOOL_NOT4_I:%.*]] = icmp ne ptr [[P:%.*]], null57; ALL-NEXT:    ret i1 [[TOBOOL_NOT4_I]]58;59entry:60  %p.addr = alloca ptr, align 861  store ptr %p, ptr %p.addr, align 862  %0 = load ptr, ptr %p.addr, align 863  %call = call i64 @count_nodes_variant2(ptr %0)64  %cmp = icmp ugt i64 %call, 065  ret i1 %cmp66}67 68define internal i64 @count_nodes_variant2(ptr %p) {69entry:70  %p.addr = alloca ptr, align 871  %size = alloca i64, align 872  store ptr %p, ptr %p.addr, align 873  store i64 0, ptr %size, align 874  br label %while.cond75 76while.cond:77  %0 = load ptr, ptr %p.addr, align 878  %tobool = icmp ne ptr %0, null79  br i1 %tobool, label %while.body, label %while.end80 81while.body:82  %1 = load ptr, ptr %p.addr, align 883  %2 = load ptr, ptr %1, align 884  store ptr %2, ptr %p.addr, align 885  %3 = load i64, ptr %size, align 886  %inc = add i64 %3, 187  store i64 %inc, ptr %size, align 888  %4 = load i64, ptr %size, align 889  %cmp = icmp ne i64 %4, 090  call void @_ZL6assumeb(i1 zeroext %cmp)91  br label %while.cond, !llvm.loop !292 93while.end:94  %5 = load i64, ptr %size, align 895  ret i64 %596}97 98define dso_local zeroext i1 @is_not_empty_variant3(ptr %p) {99; ALL-LABEL: @is_not_empty_variant3(100; ALL-NEXT:  entry:101; ALL-NEXT:    [[TOBOOL_NOT4_I:%.*]] = icmp ne ptr [[P:%.*]], null102; ALL-NEXT:    ret i1 [[TOBOOL_NOT4_I]]103;104entry:105  %p.addr = alloca ptr, align 8106  store ptr %p, ptr %p.addr, align 8107  %0 = load ptr, ptr %p.addr, align 8108  %call = call i64 @count_nodes_variant3(ptr %0)109  %cmp = icmp ugt i64 %call, 0110  ret i1 %cmp111}112 113define internal i64 @count_nodes_variant3(ptr %p) {114entry:115  %p.addr = alloca ptr, align 8116  %size = alloca i64, align 8117  store ptr %p, ptr %p.addr, align 8118  store i64 0, ptr %size, align 8119  br label %while.cond120 121while.cond:122  %0 = load ptr, ptr %p.addr, align 8123  %tobool = icmp ne ptr %0, null124  br i1 %tobool, label %while.body, label %while.end125 126while.body:127  %1 = load i64, ptr %size, align 8128  %cmp = icmp ne i64 %1, -1129  call void @_ZL6assumeb(i1 zeroext %cmp)130  %2 = load ptr, ptr %p.addr, align 8131  %3 = load ptr, ptr %2, align 8132  store ptr %3, ptr %p.addr, align 8133  %4 = load i64, ptr %size, align 8134  %inc = add i64 %4, 1135  store i64 %inc, ptr %size, align 8136  br label %while.cond, !llvm.loop !3137 138while.end:139  %5 = load i64, ptr %size, align 8140  ret i64 %5141}142 143define internal void @_ZL6assumeb(i1 zeroext %expression) {144entry:145  %expression.addr = alloca i8, align 1146  %frombool = zext i1 %expression to i8147  store i8 %frombool, ptr %expression.addr, align 1148  %0 = load i8, ptr %expression.addr, align 1149  %tobool = trunc i8 %0 to i1150  call void @llvm.assume(i1 %tobool)151  ret void152}153 154declare void @llvm.assume(i1 noundef)155 156!0 = distinct !{!0, !1}157!1 = !{!"llvm.loop.mustprogress"}158!2 = distinct !{!2, !1}159!3 = distinct !{!3, !1}160;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:161; O1: {{.*}}162; O2: {{.*}}163; O3: {{.*}}164