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