1; RUN: llc < %s 2 3define i32 @test1(i32 %x) nounwind uwtable ssp { 4entry: 5 %retval = alloca i32, align 4 6 %x.addr = alloca i32, align 4 7 store i32 %x, i32* %x.addr, align 4 8 %tmp = load i32, i32* %x.addr, align 4 9 %cmp = icmp sgt i32 %tmp, 1 10 %conv = zext i1 %cmp to i32 11 %conv1 = sext i32 %conv to i64 12 %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 1) 13 %tobool = icmp ne i64 %expval, 0 14 br i1 %tobool, label %if.then, label %if.end 15 16if.then: ; preds = %entry 17 %call = call i32 (...) @f() 18 store i32 %call, i32* %retval 19 br label %return 20 21if.end: ; preds = %entry 22 store i32 1, i32* %retval 23 br label %return 24 25return: ; preds = %if.end, %if.then 26 %0 = load i32, i32* %retval 27 ret i32 %0 28} 29 30declare i64 @llvm.expect.i64(i64, i64) nounwind readnone 31 32declare i32 @f(...) 33 34define i32 @test2(i32 %x) nounwind uwtable ssp { 35entry: 36 %retval = alloca i32, align 4 37 %x.addr = alloca i32, align 4 38 store i32 %x, i32* %x.addr, align 4 39 %tmp = load i32, i32* %x.addr, align 4 40 %conv = sext i32 %tmp to i64 41 %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 42 %tobool = icmp ne i64 %expval, 0 43 br i1 %tobool, label %if.then, label %if.end 44 45if.then: ; preds = %entry 46 %call = call i32 (...) @f() 47 store i32 %call, i32* %retval 48 br label %return 49 50if.end: ; preds = %entry 51 store i32 1, i32* %retval 52 br label %return 53 54return: ; preds = %if.end, %if.then 55 %0 = load i32, i32* %retval 56 ret i32 %0 57} 58 59define i32 @test3(i32 %x) nounwind uwtable ssp { 60entry: 61 %retval = alloca i32, align 4 62 %x.addr = alloca i32, align 4 63 store i32 %x, i32* %x.addr, align 4 64 %tmp = load i32, i32* %x.addr, align 4 65 %tobool = icmp ne i32 %tmp, 0 66 %lnot = xor i1 %tobool, true 67 %lnot.ext = zext i1 %lnot to i32 68 %conv = sext i32 %lnot.ext to i64 69 %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 70 %tobool1 = icmp ne i64 %expval, 0 71 br i1 %tobool1, label %if.then, label %if.end 72 73if.then: ; preds = %entry 74 %call = call i32 (...) @f() 75 store i32 %call, i32* %retval 76 br label %return 77 78if.end: ; preds = %entry 79 store i32 1, i32* %retval 80 br label %return 81 82return: ; preds = %if.end, %if.then 83 %0 = load i32, i32* %retval 84 ret i32 %0 85} 86 87define i32 @test4(i32 %x) nounwind uwtable ssp { 88entry: 89 %retval = alloca i32, align 4 90 %x.addr = alloca i32, align 4 91 store i32 %x, i32* %x.addr, align 4 92 %tmp = load i32, i32* %x.addr, align 4 93 %tobool = icmp ne i32 %tmp, 0 94 %lnot = xor i1 %tobool, true 95 %lnot1 = xor i1 %lnot, true 96 %lnot.ext = zext i1 %lnot1 to i32 97 %conv = sext i32 %lnot.ext to i64 98 %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 99 %tobool2 = icmp ne i64 %expval, 0 100 br i1 %tobool2, label %if.then, label %if.end 101 102if.then: ; preds = %entry 103 %call = call i32 (...) @f() 104 store i32 %call, i32* %retval 105 br label %return 106 107if.end: ; preds = %entry 108 store i32 1, i32* %retval 109 br label %return 110 111return: ; preds = %if.end, %if.then 112 %0 = load i32, i32* %retval 113 ret i32 %0 114} 115 116define i32 @test5(i32 %x) nounwind uwtable ssp { 117entry: 118 %retval = alloca i32, align 4 119 %x.addr = alloca i32, align 4 120 store i32 %x, i32* %x.addr, align 4 121 %tmp = load i32, i32* %x.addr, align 4 122 %cmp = icmp slt i32 %tmp, 0 123 %conv = zext i1 %cmp to i32 124 %conv1 = sext i32 %conv to i64 125 %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 0) 126 %tobool = icmp ne i64 %expval, 0 127 br i1 %tobool, label %if.then, label %if.end 128 129if.then: ; preds = %entry 130 %call = call i32 (...) @f() 131 store i32 %call, i32* %retval 132 br label %return 133 134if.end: ; preds = %entry 135 store i32 1, i32* %retval 136 br label %return 137 138return: ; preds = %if.end, %if.then 139 %0 = load i32, i32* %retval 140 ret i32 %0 141} 142 143define i32 @test6(i32 %x) nounwind uwtable ssp { 144entry: 145 %retval = alloca i32, align 4 146 %x.addr = alloca i32, align 4 147 store i32 %x, i32* %x.addr, align 4 148 %tmp = load i32, i32* %x.addr, align 4 149 %conv = sext i32 %tmp to i64 150 %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 151 switch i64 %expval, label %sw.epilog [ 152 i64 1, label %sw.bb 153 i64 2, label %sw.bb 154 ] 155 156sw.bb: ; preds = %entry, %entry 157 store i32 0, i32* %retval 158 br label %return 159 160sw.epilog: ; preds = %entry 161 store i32 1, i32* %retval 162 br label %return 163 164return: ; preds = %sw.epilog, %sw.bb 165 %0 = load i32, i32* %retval 166 ret i32 %0 167} 168 169define i32 @test7(i32 %x) nounwind uwtable ssp { 170entry: 171 %retval = alloca i32, align 4 172 %x.addr = alloca i32, align 4 173 store i32 %x, i32* %x.addr, align 4 174 %tmp = load i32, i32* %x.addr, align 4 175 %conv = sext i32 %tmp to i64 176 %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1) 177 switch i64 %expval, label %sw.epilog [ 178 i64 2, label %sw.bb 179 i64 3, label %sw.bb 180 ] 181 182sw.bb: ; preds = %entry, %entry 183 %tmp1 = load i32, i32* %x.addr, align 4 184 store i32 %tmp1, i32* %retval 185 br label %return 186 187sw.epilog: ; preds = %entry 188 store i32 0, i32* %retval 189 br label %return 190 191return: ; preds = %sw.epilog, %sw.bb 192 %0 = load i32, i32* %retval 193 ret i32 %0 194} 195 196define i32 @test8(i32 %x) nounwind uwtable ssp { 197entry: 198 %retval = alloca i32, align 4 199 %x.addr = alloca i32, align 4 200 store i32 %x, i32* %x.addr, align 4 201 %tmp = load i32, i32* %x.addr, align 4 202 %cmp = icmp sgt i32 %tmp, 1 203 %conv = zext i1 %cmp to i32 204 %expval = call i32 @llvm.expect.i32(i32 %conv, i32 1) 205 %tobool = icmp ne i32 %expval, 0 206 br i1 %tobool, label %if.then, label %if.end 207 208if.then: ; preds = %entry 209 %call = call i32 (...) @f() 210 store i32 %call, i32* %retval 211 br label %return 212 213if.end: ; preds = %entry 214 store i32 1, i32* %retval 215 br label %return 216 217return: ; preds = %if.end, %if.then 218 %0 = load i32, i32* %retval 219 ret i32 %0 220} 221 222declare i32 @llvm.expect.i32(i32, i32) nounwind readnone 223 224