1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instcombine -S | FileCheck %s 3 4declare void @use32(i32) 5declare void @use64(i64) 6 7define i1 @highest_bit_test_via_lshr(i32 %data, i32 %nbits) { 8; CHECK-LABEL: @highest_bit_test_via_lshr( 9; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]] 10; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = lshr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]] 11; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 12; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[DATA]], 31 13; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 14; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED]]) 15; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 16; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 17; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0 18; CHECK-NEXT: ret i1 [[ISNEG]] 19; 20 %num_low_bits_to_skip = sub i32 32, %nbits 21 %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip 22 %skip_all_bits_till_signbit = sub i32 %nbits, 1 23 %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit 24 25 call void @use32(i32 %num_low_bits_to_skip) 26 call void @use32(i32 %high_bits_extracted) 27 call void @use32(i32 %skip_all_bits_till_signbit) 28 call void @use32(i32 %signbit) 29 30 %isneg = icmp ne i32 %signbit, 0 31 ret i1 %isneg 32} 33 34define i1 @highest_bit_test_via_lshr_with_truncation(i64 %data, i32 %nbits) { 35; CHECK-LABEL: @highest_bit_test_via_lshr_with_truncation( 36; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]] 37; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64 38; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = lshr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]] 39; CHECK-NEXT: [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32 40; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 41; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 42; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 43; CHECK-NEXT: call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]]) 44; CHECK-NEXT: call void @use64(i64 [[HIGH_BITS_EXTRACTED]]) 45; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]]) 46; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 47; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 48; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0 49; CHECK-NEXT: ret i1 [[ISNEG]] 50; 51 %num_low_bits_to_skip = sub i32 64, %nbits 52 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64 53 %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide 54 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32 55 %skip_all_bits_till_signbit = sub i32 %nbits, 1 56 %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit 57 58 call void @use32(i32 %num_low_bits_to_skip) 59 call void @use64(i64 %num_low_bits_to_skip_wide) 60 call void @use64(i64 %high_bits_extracted) 61 call void @use32(i32 %high_bits_extracted_narrow) 62 call void @use32(i32 %skip_all_bits_till_signbit) 63 call void @use32(i32 %signbit) 64 65 %isneg = icmp ne i32 %signbit, 0 66 ret i1 %isneg 67} 68 69define i1 @highest_bit_test_via_ashr(i32 %data, i32 %nbits) { 70; CHECK-LABEL: @highest_bit_test_via_ashr( 71; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]] 72; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = ashr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]] 73; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 74; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i32 [[DATA]], 31 75; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 76; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED]]) 77; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 78; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 79; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0 80; CHECK-NEXT: ret i1 [[ISNEG]] 81; 82 %num_low_bits_to_skip = sub i32 32, %nbits 83 %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip 84 %skip_all_bits_till_signbit = sub i32 %nbits, 1 85 %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit 86 87 call void @use32(i32 %num_low_bits_to_skip) 88 call void @use32(i32 %high_bits_extracted) 89 call void @use32(i32 %skip_all_bits_till_signbit) 90 call void @use32(i32 %signbit) 91 92 %isneg = icmp ne i32 %signbit, 0 93 ret i1 %isneg 94} 95 96define i1 @highest_bit_test_via_ashr_with_truncation(i64 %data, i32 %nbits) { 97; CHECK-LABEL: @highest_bit_test_via_ashr_with_truncation( 98; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]] 99; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64 100; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = ashr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]] 101; CHECK-NEXT: [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32 102; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 103; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 104; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 105; CHECK-NEXT: call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]]) 106; CHECK-NEXT: call void @use64(i64 [[HIGH_BITS_EXTRACTED]]) 107; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]]) 108; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 109; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 110; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0 111; CHECK-NEXT: ret i1 [[ISNEG]] 112; 113 %num_low_bits_to_skip = sub i32 64, %nbits 114 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64 115 %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide 116 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32 117 %skip_all_bits_till_signbit = sub i32 %nbits, 1 118 %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit 119 120 call void @use32(i32 %num_low_bits_to_skip) 121 call void @use64(i64 %num_low_bits_to_skip_wide) 122 call void @use64(i64 %high_bits_extracted) 123 call void @use32(i32 %high_bits_extracted_narrow) 124 call void @use32(i32 %skip_all_bits_till_signbit) 125 call void @use32(i32 %signbit) 126 127 %isneg = icmp ne i32 %signbit, 0 128 ret i1 %isneg 129} 130 131define i1 @highest_bit_test_via_lshr_ashr(i32 %data, i32 %nbits) { 132; CHECK-LABEL: @highest_bit_test_via_lshr_ashr( 133; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]] 134; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = lshr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]] 135; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 136; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 137; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 138; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED]]) 139; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 140; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 141; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0 142; CHECK-NEXT: ret i1 [[ISNEG]] 143; 144 %num_low_bits_to_skip = sub i32 32, %nbits 145 %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip 146 %skip_all_bits_till_signbit = sub i32 %nbits, 1 147 %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit 148 149 call void @use32(i32 %num_low_bits_to_skip) 150 call void @use32(i32 %high_bits_extracted) 151 call void @use32(i32 %skip_all_bits_till_signbit) 152 call void @use32(i32 %signbit) 153 154 %isneg = icmp ne i32 %signbit, 0 155 ret i1 %isneg 156} 157 158define i1 @highest_bit_test_via_lshr_ashe_with_truncation(i64 %data, i32 %nbits) { 159; CHECK-LABEL: @highest_bit_test_via_lshr_ashe_with_truncation( 160; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]] 161; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64 162; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = lshr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]] 163; CHECK-NEXT: [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32 164; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 165; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 166; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 167; CHECK-NEXT: call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]]) 168; CHECK-NEXT: call void @use64(i64 [[HIGH_BITS_EXTRACTED]]) 169; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]]) 170; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 171; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 172; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0 173; CHECK-NEXT: ret i1 [[ISNEG]] 174; 175 %num_low_bits_to_skip = sub i32 64, %nbits 176 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64 177 %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide 178 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32 179 %skip_all_bits_till_signbit = sub i32 %nbits, 1 180 %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit 181 182 call void @use32(i32 %num_low_bits_to_skip) 183 call void @use64(i64 %num_low_bits_to_skip_wide) 184 call void @use64(i64 %high_bits_extracted) 185 call void @use32(i32 %high_bits_extracted_narrow) 186 call void @use32(i32 %skip_all_bits_till_signbit) 187 call void @use32(i32 %signbit) 188 189 %isneg = icmp ne i32 %signbit, 0 190 ret i1 %isneg 191} 192 193define i1 @highest_bit_test_via_ashr_lshr(i32 %data, i32 %nbits) { 194; CHECK-LABEL: @highest_bit_test_via_ashr_lshr( 195; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 32, [[NBITS:%.*]] 196; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = ashr i32 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP]] 197; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 198; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 199; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 200; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED]]) 201; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 202; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 203; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[DATA]], 0 204; CHECK-NEXT: ret i1 [[ISNEG]] 205; 206 %num_low_bits_to_skip = sub i32 32, %nbits 207 %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip 208 %skip_all_bits_till_signbit = sub i32 %nbits, 1 209 %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit 210 211 call void @use32(i32 %num_low_bits_to_skip) 212 call void @use32(i32 %high_bits_extracted) 213 call void @use32(i32 %skip_all_bits_till_signbit) 214 call void @use32(i32 %signbit) 215 216 %isneg = icmp ne i32 %signbit, 0 217 ret i1 %isneg 218} 219 220define i1 @highest_bit_test_via_ashr_lshr_with_truncation(i64 %data, i32 %nbits) { 221; CHECK-LABEL: @highest_bit_test_via_ashr_lshr_with_truncation( 222; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP:%.*]] = sub i32 64, [[NBITS:%.*]] 223; CHECK-NEXT: [[NUM_LOW_BITS_TO_SKIP_WIDE:%.*]] = zext i32 [[NUM_LOW_BITS_TO_SKIP]] to i64 224; CHECK-NEXT: [[HIGH_BITS_EXTRACTED:%.*]] = ashr i64 [[DATA:%.*]], [[NUM_LOW_BITS_TO_SKIP_WIDE]] 225; CHECK-NEXT: [[HIGH_BITS_EXTRACTED_NARROW:%.*]] = trunc i64 [[HIGH_BITS_EXTRACTED]] to i32 226; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1 227; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[HIGH_BITS_EXTRACTED_NARROW]], [[SKIP_ALL_BITS_TILL_SIGNBIT]] 228; CHECK-NEXT: call void @use32(i32 [[NUM_LOW_BITS_TO_SKIP]]) 229; CHECK-NEXT: call void @use64(i64 [[NUM_LOW_BITS_TO_SKIP_WIDE]]) 230; CHECK-NEXT: call void @use64(i64 [[HIGH_BITS_EXTRACTED]]) 231; CHECK-NEXT: call void @use32(i32 [[HIGH_BITS_EXTRACTED_NARROW]]) 232; CHECK-NEXT: call void @use32(i32 [[SKIP_ALL_BITS_TILL_SIGNBIT]]) 233; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 234; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[DATA]], 0 235; CHECK-NEXT: ret i1 [[ISNEG]] 236; 237 %num_low_bits_to_skip = sub i32 64, %nbits 238 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64 239 %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide 240 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32 241 %skip_all_bits_till_signbit = sub i32 %nbits, 1 242 %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit 243 244 call void @use32(i32 %num_low_bits_to_skip) 245 call void @use64(i64 %num_low_bits_to_skip_wide) 246 call void @use64(i64 %high_bits_extracted) 247 call void @use32(i32 %high_bits_extracted_narrow) 248 call void @use32(i32 %skip_all_bits_till_signbit) 249 call void @use32(i32 %signbit) 250 251 %isneg = icmp ne i32 %signbit, 0 252 ret i1 %isneg 253} 254 255;------------------------------------------------------------------------------; 256 257define i1 @unsigned_sign_bit_extract(i32 %x) { 258; CHECK-LABEL: @unsigned_sign_bit_extract( 259; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X:%.*]], 0 260; CHECK-NEXT: ret i1 [[ISNEG]] 261; 262 %signbit = lshr i32 %x, 31 263 %isneg = icmp ne i32 %signbit, 0 264 ret i1 %isneg 265} 266define i1 @unsigned_sign_bit_extract_extrause(i32 %x) { 267; CHECK-LABEL: @unsigned_sign_bit_extract_extrause( 268; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[X:%.*]], 31 269; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 270; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X]], 0 271; CHECK-NEXT: ret i1 [[ISNEG]] 272; 273 %signbit = lshr i32 %x, 31 274 call void @use32(i32 %signbit) 275 %isneg = icmp ne i32 %signbit, 0 276 ret i1 %isneg 277} 278define i1 @unsigned_sign_bit_extract_extrause__ispositive(i32 %x) { 279; CHECK-LABEL: @unsigned_sign_bit_extract_extrause__ispositive( 280; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[X:%.*]], 31 281; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]]) 282; CHECK-NEXT: [[ISNEG:%.*]] = icmp sgt i32 [[X]], -1 283; CHECK-NEXT: ret i1 [[ISNEG]] 284; 285 %signbit = lshr i32 %x, 31 286 call void @use32(i32 %signbit) 287 %isneg = icmp eq i32 %signbit, 0 288 ret i1 %isneg 289} 290define i1 @signed_sign_bit_extract(i32 %x) { 291; CHECK-LABEL: @signed_sign_bit_extract( 292; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X:%.*]], 0 293; CHECK-NEXT: ret i1 [[ISNEG]] 294; 295 %signsmear = ashr i32 %x, 31 296 %isneg = icmp ne i32 %signsmear, 0 297 ret i1 %isneg 298} 299define i1 @signed_sign_bit_extract_extrause(i32 %x) { 300; CHECK-LABEL: @signed_sign_bit_extract_extrause( 301; CHECK-NEXT: [[SIGNSMEAR:%.*]] = ashr i32 [[X:%.*]], 31 302; CHECK-NEXT: call void @use32(i32 [[SIGNSMEAR]]) 303; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X]], 0 304; CHECK-NEXT: ret i1 [[ISNEG]] 305; 306 %signsmear = ashr i32 %x, 31 307 call void @use32(i32 %signsmear) 308 %isneg = icmp ne i32 %signsmear, 0 309 ret i1 %isneg 310} 311define i1 @unsigned_sign_bit_extract_with_trunc(i64 %x) { 312; CHECK-LABEL: @unsigned_sign_bit_extract_with_trunc( 313; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X:%.*]], 0 314; CHECK-NEXT: ret i1 [[ISNEG]] 315; 316 %signbit = lshr i64 %x, 63 317 %signbit_narrow = trunc i64 %signbit to i32 318 %isneg = icmp ne i32 %signbit_narrow, 0 319 ret i1 %isneg 320} 321define i1 @unsigned_sign_bit_extract_with_trunc_extrause(i64 %x) { 322; CHECK-LABEL: @unsigned_sign_bit_extract_with_trunc_extrause( 323; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i64 [[X:%.*]], 63 324; CHECK-NEXT: call void @use64(i64 [[SIGNBIT]]) 325; CHECK-NEXT: [[SIGNBIT_NARROW:%.*]] = trunc i64 [[SIGNBIT]] to i32 326; CHECK-NEXT: call void @use32(i32 [[SIGNBIT_NARROW]]) 327; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X]], 0 328; CHECK-NEXT: ret i1 [[ISNEG]] 329; 330 %signbit = lshr i64 %x, 63 331 call void @use64(i64 %signbit) 332 %signbit_narrow = trunc i64 %signbit to i32 333 call void @use32(i32 %signbit_narrow) 334 %isneg = icmp ne i32 %signbit_narrow, 0 335 ret i1 %isneg 336} 337define i1 @signed_sign_bit_extract_trunc(i64 %x) { 338; CHECK-LABEL: @signed_sign_bit_extract_trunc( 339; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X:%.*]], 0 340; CHECK-NEXT: ret i1 [[ISNEG]] 341; 342 %signsmear = ashr i64 %x, 63 343 %signsmear_narrow = trunc i64 %signsmear to i32 344 %isneg = icmp ne i32 %signsmear_narrow, 0 345 ret i1 %isneg 346} 347define i1 @signed_sign_bit_extract_trunc_extrause(i64 %x) { 348; CHECK-LABEL: @signed_sign_bit_extract_trunc_extrause( 349; CHECK-NEXT: [[SIGNSMEAR:%.*]] = ashr i64 [[X:%.*]], 63 350; CHECK-NEXT: call void @use64(i64 [[SIGNSMEAR]]) 351; CHECK-NEXT: [[SIGNSMEAR_NARROW:%.*]] = trunc i64 [[SIGNSMEAR]] to i32 352; CHECK-NEXT: call void @use32(i32 [[SIGNSMEAR_NARROW]]) 353; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X]], 0 354; CHECK-NEXT: ret i1 [[ISNEG]] 355; 356 %signsmear = ashr i64 %x, 63 357 call void @use64(i64 %signsmear) 358 %signsmear_narrow = trunc i64 %signsmear to i32 359 call void @use32(i32 %signsmear_narrow) 360 %isneg = icmp ne i32 %signsmear_narrow, 0 361 ret i1 %isneg 362} 363