1b6aaa883SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=correlated-propagation -S | FileCheck %s 3b6aaa883SRoman Lebedev 4b6aaa883SRoman Lebedevdeclare void @llvm.assume(i1) 5*2ad9a658SDianQKdeclare i32 @llvm.abs.i32(i32, i1) 6b50961bdSNikita Popovdeclare i8 @llvm.abs.i8(i8, i1) 7b50961bdSNikita Popovdeclare i1 @llvm.abs.i1(i1, i1) 8b6aaa883SRoman Lebedev 9b6aaa883SRoman Lebedev; If we don't know anything about the argument, we can't do anything. 10b6aaa883SRoman Lebedev 11b6aaa883SRoman Lebedevdefine i8 @test0(i8 %x) { 12b6aaa883SRoman Lebedev; CHECK-LABEL: @test0( 13b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 false) 14b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 15b6aaa883SRoman Lebedev; 16b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 17b6aaa883SRoman Lebedev ret i8 %r 18b6aaa883SRoman Lebedev} 19b6aaa883SRoman Lebedevdefine i8 @test1(i8 %x) { 20b6aaa883SRoman Lebedev; CHECK-LABEL: @test1( 21b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X:%.*]], i1 true) 22b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 23b6aaa883SRoman Lebedev; 24b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 25b6aaa883SRoman Lebedev ret i8 %r 26b6aaa883SRoman Lebedev} 27b6aaa883SRoman Lebedev 28b6aaa883SRoman Lebedev; But if we know that the argument is always positive, we can bypass @llvm.abs. 29b6aaa883SRoman Lebedev 30b6aaa883SRoman Lebedevdefine i8 @test2(i8 %x) { 31b6aaa883SRoman Lebedev; CHECK-LABEL: @test2( 32b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], -1 33b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 34c329a47dSRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 35b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 36b6aaa883SRoman Lebedev; 37b6aaa883SRoman Lebedev 38b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, -1 39b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 40b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 41b6aaa883SRoman Lebedev ret i8 %r 42b6aaa883SRoman Lebedev} 43b6aaa883SRoman Lebedevdefine i8 @test3(i8 %x) { 44b6aaa883SRoman Lebedev; CHECK-LABEL: @test3( 45b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], -1 46b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 47b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 48b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 49b6aaa883SRoman Lebedev; 50b6aaa883SRoman Lebedev 51b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, -1 52b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 53b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 54b6aaa883SRoman Lebedev ret i8 %r 55b6aaa883SRoman Lebedev} 56b6aaa883SRoman Lebedev 57b6aaa883SRoman Lebedevdefine i8 @test4(i8 %x) { 58b6aaa883SRoman Lebedev; CHECK-LABEL: @test4( 59b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 0 60b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 61c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 62b6aaa883SRoman Lebedev; 63b6aaa883SRoman Lebedev 64b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, 0 65b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 66b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 67b6aaa883SRoman Lebedev ret i8 %r 68b6aaa883SRoman Lebedev} 69b6aaa883SRoman Lebedevdefine i8 @test5(i8 %x) { 70b6aaa883SRoman Lebedev; CHECK-LABEL: @test5( 71b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 0 72b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 73c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 74b6aaa883SRoman Lebedev; 75b6aaa883SRoman Lebedev 76b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, 0 77b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 78b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 79b6aaa883SRoman Lebedev ret i8 %r 80b6aaa883SRoman Lebedev} 81b6aaa883SRoman Lebedev 82b6aaa883SRoman Lebedevdefine i8 @test6(i8 %x) { 83b6aaa883SRoman Lebedev; CHECK-LABEL: @test6( 84b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 1 85b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 86c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 87b6aaa883SRoman Lebedev; 88b6aaa883SRoman Lebedev 89b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, 1 90b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 91b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 92b6aaa883SRoman Lebedev ret i8 %r 93b6aaa883SRoman Lebedev} 94b6aaa883SRoman Lebedevdefine i8 @test7(i8 %x) { 95b6aaa883SRoman Lebedev; CHECK-LABEL: @test7( 96b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sge i8 [[X:%.*]], 1 97b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 98c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 99b6aaa883SRoman Lebedev; 100b6aaa883SRoman Lebedev 101b6aaa883SRoman Lebedev %lim = icmp sge i8 %x, 1 102b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 103b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 104b6aaa883SRoman Lebedev ret i8 %r 105b6aaa883SRoman Lebedev} 106b6aaa883SRoman Lebedev 107b6aaa883SRoman Lebedev; Likewise, INT_MIN is fine for otherwise-positive value. 108b6aaa883SRoman Lebedev 109b6aaa883SRoman Lebedevdefine i8 @test8(i8 %x) { 110b6aaa883SRoman Lebedev; CHECK-LABEL: @test8( 111b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], 127 112b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 113c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 114b6aaa883SRoman Lebedev; 115b6aaa883SRoman Lebedev 116b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 127 117b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 118b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 119b6aaa883SRoman Lebedev ret i8 %r 120b6aaa883SRoman Lebedev} 121b6aaa883SRoman Lebedevdefine i8 @test9(i8 %x) { 122b6aaa883SRoman Lebedev; CHECK-LABEL: @test9( 123b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], 127 124b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 125c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 126b6aaa883SRoman Lebedev; 127b6aaa883SRoman Lebedev 128b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 127 129b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 130b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 131b6aaa883SRoman Lebedev ret i8 %r 132b6aaa883SRoman Lebedev} 133b6aaa883SRoman Lebedev 134b6aaa883SRoman Lebedevdefine i8 @test10(i8 %x) { 135b6aaa883SRoman Lebedev; CHECK-LABEL: @test10( 136b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -128 137b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 138c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 139b6aaa883SRoman Lebedev; 140b6aaa883SRoman Lebedev 141b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 128 142b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 143b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 144b6aaa883SRoman Lebedev ret i8 %r 145b6aaa883SRoman Lebedev} 146b6aaa883SRoman Lebedevdefine i8 @test11(i8 %x) { 147b6aaa883SRoman Lebedev; CHECK-LABEL: @test11( 148b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -128 149b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 150c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[X]] 151b6aaa883SRoman Lebedev; 152b6aaa883SRoman Lebedev 153b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 128 154b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 155b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 156b6aaa883SRoman Lebedev ret i8 %r 157b6aaa883SRoman Lebedev} 158b6aaa883SRoman Lebedev 159b6aaa883SRoman Lebedevdefine i8 @test12(i8 %x) { 160b6aaa883SRoman Lebedev; CHECK-LABEL: @test12( 161b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -127 162b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 163b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false) 164b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 165b6aaa883SRoman Lebedev; 166b6aaa883SRoman Lebedev 167b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 129 168b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 169b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 170b6aaa883SRoman Lebedev ret i8 %r 171b6aaa883SRoman Lebedev} 172b6aaa883SRoman Lebedevdefine i8 @test13(i8 %x) { 173b6aaa883SRoman Lebedev; CHECK-LABEL: @test13( 174b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ule i8 [[X:%.*]], -127 175b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 176b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 177b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 178b6aaa883SRoman Lebedev; 179b6aaa883SRoman Lebedev 180b6aaa883SRoman Lebedev %lim = icmp ule i8 %x, 129 181b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 182b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 183b6aaa883SRoman Lebedev ret i8 %r 184b6aaa883SRoman Lebedev} 185b6aaa883SRoman Lebedev 186b6aaa883SRoman Lebedev; Likewise, if we know that argument is always negative, 187b6aaa883SRoman Lebedev; we can expand @llvm.abs into a direct negation. 188b6aaa883SRoman Lebedev; For negative arguments, we must be careful to include 0 though. 189b6aaa883SRoman Lebedev 190b6aaa883SRoman Lebedevdefine i8 @test14(i8 %x) { 191b6aaa883SRoman Lebedev; CHECK-LABEL: @test14( 192b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], -1 193b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 194c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub i8 0, [[X]] 195c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 196b6aaa883SRoman Lebedev; 197b6aaa883SRoman Lebedev 198b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, -1 199b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 200b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 201b6aaa883SRoman Lebedev ret i8 %r 202b6aaa883SRoman Lebedev} 203b6aaa883SRoman Lebedevdefine i8 @test15(i8 %x) { 204b6aaa883SRoman Lebedev; CHECK-LABEL: @test15( 205b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], -1 206b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 207c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub nsw i8 0, [[X]] 208c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 209b6aaa883SRoman Lebedev; 210b6aaa883SRoman Lebedev 211b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, -1 212b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 213b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 214b6aaa883SRoman Lebedev ret i8 %r 215b6aaa883SRoman Lebedev} 216b6aaa883SRoman Lebedev 217b6aaa883SRoman Lebedevdefine i8 @test16(i8 %x) { 218b6aaa883SRoman Lebedev; CHECK-LABEL: @test16( 219b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 0 220b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 221c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub i8 0, [[X]] 222c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 223b6aaa883SRoman Lebedev; 224b6aaa883SRoman Lebedev 225b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, 0 226b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 227b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 228b6aaa883SRoman Lebedev ret i8 %r 229b6aaa883SRoman Lebedev} 230b6aaa883SRoman Lebedevdefine i8 @test17(i8 %x) { 231b6aaa883SRoman Lebedev; CHECK-LABEL: @test17( 232b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 0 233b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 234c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub nsw i8 0, [[X]] 235c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 236b6aaa883SRoman Lebedev; 237b6aaa883SRoman Lebedev 238b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, 0 239b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 240b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 241b6aaa883SRoman Lebedev ret i8 %r 242b6aaa883SRoman Lebedev} 243b6aaa883SRoman Lebedev 244b6aaa883SRoman Lebedevdefine i8 @test18(i8 %x) { 245b6aaa883SRoman Lebedev; CHECK-LABEL: @test18( 246b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 1 247b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 248b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false) 249b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 250b6aaa883SRoman Lebedev; 251b6aaa883SRoman Lebedev 252b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, 1 253b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 254b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 255b6aaa883SRoman Lebedev ret i8 %r 256b6aaa883SRoman Lebedev} 257b6aaa883SRoman Lebedevdefine i8 @test19(i8 %x) { 258b6aaa883SRoman Lebedev; CHECK-LABEL: @test19( 259b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp sle i8 [[X:%.*]], 1 260b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 261b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 262b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 263b6aaa883SRoman Lebedev; 264b6aaa883SRoman Lebedev 265b6aaa883SRoman Lebedev %lim = icmp sle i8 %x, 1 266b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 267b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 268b6aaa883SRoman Lebedev ret i8 %r 269b6aaa883SRoman Lebedev} 270b6aaa883SRoman Lebedev 271b6aaa883SRoman Lebedev; And again, INT_MIN is also fine for otherwise-negative range. 272b6aaa883SRoman Lebedev 273b6aaa883SRoman Lebedevdefine i8 @test20(i8 %x) { 274b6aaa883SRoman Lebedev; CHECK-LABEL: @test20( 275b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], 127 276b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 277b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 false) 278b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 279b6aaa883SRoman Lebedev; 280b6aaa883SRoman Lebedev 281b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 127 282b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 283b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 284b6aaa883SRoman Lebedev ret i8 %r 285b6aaa883SRoman Lebedev} 286b6aaa883SRoman Lebedevdefine i8 @test21(i8 %x) { 287b6aaa883SRoman Lebedev; CHECK-LABEL: @test21( 288b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], 127 289b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 290b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 291b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 292b6aaa883SRoman Lebedev; 293b6aaa883SRoman Lebedev 294b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 127 295b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 296b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 297b6aaa883SRoman Lebedev ret i8 %r 298b6aaa883SRoman Lebedev} 299b6aaa883SRoman Lebedev 300b6aaa883SRoman Lebedevdefine i8 @test22(i8 %x) { 301b6aaa883SRoman Lebedev; CHECK-LABEL: @test22( 302b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -128 303b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 304c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub i8 0, [[X]] 305c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 306b6aaa883SRoman Lebedev; 307b6aaa883SRoman Lebedev 308b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 128 309b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 310b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 311b6aaa883SRoman Lebedev ret i8 %r 312b6aaa883SRoman Lebedev} 313b6aaa883SRoman Lebedevdefine i8 @test23(i8 %x) { 314b6aaa883SRoman Lebedev; CHECK-LABEL: @test23( 315b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -128 316b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 317c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub nsw i8 0, [[X]] 318c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 319b6aaa883SRoman Lebedev; 320b6aaa883SRoman Lebedev 321b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 128 322b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 323b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 324b6aaa883SRoman Lebedev ret i8 %r 325b6aaa883SRoman Lebedev} 326b6aaa883SRoman Lebedev 327b6aaa883SRoman Lebedevdefine i8 @test24(i8 %x) { 328b6aaa883SRoman Lebedev; CHECK-LABEL: @test24( 329b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -127 330b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 331c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub nsw i8 0, [[X]] 332c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 333b6aaa883SRoman Lebedev; 334b6aaa883SRoman Lebedev 335b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 129 336b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 337b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 338b6aaa883SRoman Lebedev ret i8 %r 339b6aaa883SRoman Lebedev} 340b6aaa883SRoman Lebedevdefine i8 @test25(i8 %x) { 341b6aaa883SRoman Lebedev; CHECK-LABEL: @test25( 342b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp uge i8 [[X:%.*]], -127 343b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 344c329a47dSRoman Lebedev; CHECK-NEXT: [[R1:%.*]] = sub nsw i8 0, [[X]] 345c329a47dSRoman Lebedev; CHECK-NEXT: ret i8 [[R1]] 346b6aaa883SRoman Lebedev; 347b6aaa883SRoman Lebedev 348b6aaa883SRoman Lebedev %lim = icmp uge i8 %x, 129 349b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 350b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 351b6aaa883SRoman Lebedev ret i8 %r 352b6aaa883SRoman Lebedev} 353b6aaa883SRoman Lebedev 354b6aaa883SRoman Lebedev; If all else fails, we can sometimes at least inferr NSW. 355b6aaa883SRoman Lebedev 356b6aaa883SRoman Lebedevdefine i8 @test26(i8 %x) { 357b6aaa883SRoman Lebedev; CHECK-LABEL: @test26( 358b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ne i8 [[X:%.*]], -128 359b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 360c329a47dSRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 361b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 362b6aaa883SRoman Lebedev; 363b6aaa883SRoman Lebedev %lim = icmp ne i8 %x, 128 364b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 365b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 0) 366b6aaa883SRoman Lebedev ret i8 %r 367b6aaa883SRoman Lebedev} 368b6aaa883SRoman Lebedevdefine i8 @test27(i8 %x) { 369b6aaa883SRoman Lebedev; CHECK-LABEL: @test27( 370b6aaa883SRoman Lebedev; CHECK-NEXT: [[LIM:%.*]] = icmp ne i8 [[X:%.*]], -128 371b6aaa883SRoman Lebedev; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 372b6aaa883SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true) 373b6aaa883SRoman Lebedev; CHECK-NEXT: ret i8 [[R]] 374b6aaa883SRoman Lebedev; 375b6aaa883SRoman Lebedev %lim = icmp ne i8 %x, 128 376b6aaa883SRoman Lebedev call void @llvm.assume(i1 %lim) 377b50961bdSNikita Popov %r = call i8 @llvm.abs.i8(i8 %x, i1 1) 378b6aaa883SRoman Lebedev ret i8 %r 379b6aaa883SRoman Lebedev} 380b50961bdSNikita Popov 381b50961bdSNikita Popovdefine i1 @pr59887(i1 %x, i1 %c) { 382b50961bdSNikita Popov; CHECK-LABEL: @pr59887( 383*2ad9a658SDianQK; CHECK-NEXT: [[RES:%.*]] = select i1 [[C:%.*]], i1 [[X:%.*]], i1 false 384fd07583cSNikita Popov; CHECK-NEXT: ret i1 [[RES]] 385b50961bdSNikita Popov; 386b50961bdSNikita Popov %abs = call i1 @llvm.abs.i1(i1 %x, i1 false) 387b50961bdSNikita Popov %res = select i1 %c, i1 %abs, i1 false 388b50961bdSNikita Popov ret i1 %res 389b50961bdSNikita Popov} 390*2ad9a658SDianQK 391*2ad9a658SDianQK; Because of `undef`, We can't delete `abs`. 392*2ad9a658SDianQK; We can't replace the `abs` argument with true either. 393*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false(i1 %c0, i1 %c1, i8 %v1) { 394*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false( 395*2ad9a658SDianQK; CHECK-NEXT: start: 396*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]] 397*2ad9a658SDianQK; CHECK: bb0: 398*2ad9a658SDianQK; CHECK-NEXT: [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32 399*2ad9a658SDianQK; CHECK-NEXT: br label [[BB1]] 400*2ad9a658SDianQK; CHECK: bb1: 401*2ad9a658SDianQK; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ] 402*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]] 403*2ad9a658SDianQK; CHECK: bb2: 404*2ad9a658SDianQK; CHECK-NEXT: [[Z:%.*]] = call i32 @llvm.abs.i32(i32 [[X]], i1 false) 405*2ad9a658SDianQK; CHECK-NEXT: ret i32 [[Z]] 406*2ad9a658SDianQK; 407*2ad9a658SDianQKstart: 408*2ad9a658SDianQK br i1 %c0, label %bb0, label %bb1 409*2ad9a658SDianQK 410*2ad9a658SDianQKbb0: 411*2ad9a658SDianQK %v1_i32 = zext i8 %v1 to i32 412*2ad9a658SDianQK br label %bb1 413*2ad9a658SDianQK 414*2ad9a658SDianQKbb1: 415*2ad9a658SDianQK %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ] 416*2ad9a658SDianQK br i1 %c1, label %bb0, label %bb2 417*2ad9a658SDianQK 418*2ad9a658SDianQKbb2: 419*2ad9a658SDianQK %z = call i32 @llvm.abs.i32(i32 %x, i1 false) 420*2ad9a658SDianQK ret i32 %z 421*2ad9a658SDianQK} 422*2ad9a658SDianQK 423*2ad9a658SDianQK; Because of `and`, we can delete `abs`. 424*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false_and(i1 %c0, i1 %c1, i8 %v1) { 425*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false_and( 426*2ad9a658SDianQK; CHECK-NEXT: start: 427*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]] 428*2ad9a658SDianQK; CHECK: bb0: 429*2ad9a658SDianQK; CHECK-NEXT: [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32 430*2ad9a658SDianQK; CHECK-NEXT: br label [[BB1]] 431*2ad9a658SDianQK; CHECK: bb1: 432*2ad9a658SDianQK; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ] 433*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]] 434*2ad9a658SDianQK; CHECK: bb2: 435*2ad9a658SDianQK; CHECK-NEXT: [[Y:%.*]] = and i32 [[X]], 255 436*2ad9a658SDianQK; CHECK-NEXT: ret i32 [[Y]] 437*2ad9a658SDianQK; 438*2ad9a658SDianQKstart: 439*2ad9a658SDianQK br i1 %c0, label %bb0, label %bb1 440*2ad9a658SDianQK 441*2ad9a658SDianQKbb0: 442*2ad9a658SDianQK %v1_i32 = zext i8 %v1 to i32 443*2ad9a658SDianQK br label %bb1 444*2ad9a658SDianQK 445*2ad9a658SDianQKbb1: 446*2ad9a658SDianQK %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ] 447*2ad9a658SDianQK br i1 %c1, label %bb0, label %bb2 448*2ad9a658SDianQK 449*2ad9a658SDianQKbb2: 450*2ad9a658SDianQK %y = and i32 %x, 255 451*2ad9a658SDianQK %z = call i32 @llvm.abs.i32(i32 %y, i1 false) 452*2ad9a658SDianQK ret i32 %z 453*2ad9a658SDianQK} 454*2ad9a658SDianQK 455*2ad9a658SDianQK; Because of `undef`, we can't replace `abs` with `sub`. 456*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_false_sub(i1 %c0, i1 %c1, i32 %v1, i32 %v2) { 457*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_false_sub( 458*2ad9a658SDianQK; CHECK-NEXT: start: 459*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]] 460*2ad9a658SDianQK; CHECK: bb0: 461*2ad9a658SDianQK; CHECK-NEXT: [[V3:%.*]] = add i32 [[V1:%.*]], [[V2:%.*]] 462*2ad9a658SDianQK; CHECK-NEXT: [[LIM:%.*]] = icmp sle i32 [[V3]], -1 463*2ad9a658SDianQK; CHECK-NEXT: call void @llvm.assume(i1 [[LIM]]) 464*2ad9a658SDianQK; CHECK-NEXT: br label [[BB1]] 465*2ad9a658SDianQK; CHECK: bb1: 466*2ad9a658SDianQK; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[V3]], [[BB0]] ], [ undef, [[START:%.*]] ] 467*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]] 468*2ad9a658SDianQK; CHECK: bb2: 469*2ad9a658SDianQK; CHECK-NEXT: [[Z:%.*]] = call i32 @llvm.abs.i32(i32 [[X]], i1 false) 470*2ad9a658SDianQK; CHECK-NEXT: ret i32 [[Z]] 471*2ad9a658SDianQK; 472*2ad9a658SDianQKstart: 473*2ad9a658SDianQK br i1 %c0, label %bb0, label %bb1 474*2ad9a658SDianQK 475*2ad9a658SDianQKbb0: 476*2ad9a658SDianQK %v3 = add i32 %v1, %v2 477*2ad9a658SDianQK %lim = icmp sle i32 %v3, -1 478*2ad9a658SDianQK call void @llvm.assume(i1 %lim) 479*2ad9a658SDianQK br label %bb1 480*2ad9a658SDianQK 481*2ad9a658SDianQKbb1: 482*2ad9a658SDianQK %x = phi i32 [ %v3, %bb0 ], [ undef, %start ] 483*2ad9a658SDianQK br i1 %c1, label %bb0, label %bb2 484*2ad9a658SDianQK 485*2ad9a658SDianQKbb2: 486*2ad9a658SDianQK %z = call i32 @llvm.abs.i32(i32 %x, i1 false) 487*2ad9a658SDianQK ret i32 %z 488*2ad9a658SDianQK} 489*2ad9a658SDianQK 490*2ad9a658SDianQK; We can delete `abs`. 491*2ad9a658SDianQKdefine i32 @pr68381_undef_abs_true(i1 %c0, i1 %c1, i8 %v1) { 492*2ad9a658SDianQK; CHECK-LABEL: @pr68381_undef_abs_true( 493*2ad9a658SDianQK; CHECK-NEXT: start: 494*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C0:%.*]], label [[BB0:%.*]], label [[BB1:%.*]] 495*2ad9a658SDianQK; CHECK: bb0: 496*2ad9a658SDianQK; CHECK-NEXT: [[V1_I32:%.*]] = zext i8 [[V1:%.*]] to i32 497*2ad9a658SDianQK; CHECK-NEXT: br label [[BB1]] 498*2ad9a658SDianQK; CHECK: bb1: 499*2ad9a658SDianQK; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[V1_I32]], [[BB0]] ], [ undef, [[START:%.*]] ] 500*2ad9a658SDianQK; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB0]], label [[BB2:%.*]] 501*2ad9a658SDianQK; CHECK: bb2: 502*2ad9a658SDianQK; CHECK-NEXT: ret i32 [[X]] 503*2ad9a658SDianQK; 504*2ad9a658SDianQKstart: 505*2ad9a658SDianQK br i1 %c0, label %bb0, label %bb1 506*2ad9a658SDianQK 507*2ad9a658SDianQKbb0: 508*2ad9a658SDianQK %v1_i32 = zext i8 %v1 to i32 509*2ad9a658SDianQK br label %bb1 510*2ad9a658SDianQK 511*2ad9a658SDianQKbb1: 512*2ad9a658SDianQK %x = phi i32 [ %v1_i32, %bb0 ], [ undef, %start ] 513*2ad9a658SDianQK br i1 %c1, label %bb0, label %bb2 514*2ad9a658SDianQK 515*2ad9a658SDianQKbb2: 516*2ad9a658SDianQK %z = call i32 @llvm.abs.i32(i32 %x, i1 true) 517*2ad9a658SDianQK ret i32 %z 518*2ad9a658SDianQK} 519