363 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 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]], -112; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[DATA]], 3113; 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]], 018; CHECK-NEXT: ret i1 [[ISNEG]]19;20 %num_low_bits_to_skip = sub i32 32, %nbits21 %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip22 %skip_all_bits_till_signbit = sub i32 %nbits, 123 %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit24 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, 031 ret i1 %isneg32}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 i6438; 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 i3240; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -141; 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]], 049; CHECK-NEXT: ret i1 [[ISNEG]]50;51 %num_low_bits_to_skip = sub i32 64, %nbits52 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i6453 %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide54 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i3255 %skip_all_bits_till_signbit = sub i32 %nbits, 156 %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit57 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, 066 ret i1 %isneg67}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]], -174; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i32 [[DATA]], 3175; 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]], 080; CHECK-NEXT: ret i1 [[ISNEG]]81;82 %num_low_bits_to_skip = sub i32 32, %nbits83 %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip84 %skip_all_bits_till_signbit = sub i32 %nbits, 185 %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit86 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, 093 ret i1 %isneg94}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 i64100; 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 i32102; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1103; 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]], 0111; CHECK-NEXT: ret i1 [[ISNEG]]112;113 %num_low_bits_to_skip = sub i32 64, %nbits114 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64115 %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide116 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32117 %skip_all_bits_till_signbit = sub i32 %nbits, 1118 %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit119 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, 0128 ret i1 %isneg129}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]], -1136; 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]], 0142; CHECK-NEXT: ret i1 [[ISNEG]]143;144 %num_low_bits_to_skip = sub i32 32, %nbits145 %high_bits_extracted = lshr i32 %data, %num_low_bits_to_skip146 %skip_all_bits_till_signbit = sub i32 %nbits, 1147 %signbit = ashr i32 %high_bits_extracted, %skip_all_bits_till_signbit148 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, 0155 ret i1 %isneg156}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 i64162; 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 i32164; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1165; 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]], 0173; CHECK-NEXT: ret i1 [[ISNEG]]174;175 %num_low_bits_to_skip = sub i32 64, %nbits176 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64177 %high_bits_extracted = lshr i64 %data, %num_low_bits_to_skip_wide178 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32179 %skip_all_bits_till_signbit = sub i32 %nbits, 1180 %signbit = ashr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit181 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, 0190 ret i1 %isneg191}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]], -1198; 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]], 0204; CHECK-NEXT: ret i1 [[ISNEG]]205;206 %num_low_bits_to_skip = sub i32 32, %nbits207 %high_bits_extracted = ashr i32 %data, %num_low_bits_to_skip208 %skip_all_bits_till_signbit = sub i32 %nbits, 1209 %signbit = lshr i32 %high_bits_extracted, %skip_all_bits_till_signbit210 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, 0217 ret i1 %isneg218}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 i64224; 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 i32226; CHECK-NEXT: [[SKIP_ALL_BITS_TILL_SIGNBIT:%.*]] = add i32 [[NBITS]], -1227; 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]], 0235; CHECK-NEXT: ret i1 [[ISNEG]]236;237 %num_low_bits_to_skip = sub i32 64, %nbits238 %num_low_bits_to_skip_wide = zext i32 %num_low_bits_to_skip to i64239 %high_bits_extracted = ashr i64 %data, %num_low_bits_to_skip_wide240 %high_bits_extracted_narrow = trunc i64 %high_bits_extracted to i32241 %skip_all_bits_till_signbit = sub i32 %nbits, 1242 %signbit = lshr i32 %high_bits_extracted_narrow, %skip_all_bits_till_signbit243 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, 0252 ret i1 %isneg253}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:%.*]], 0260; CHECK-NEXT: ret i1 [[ISNEG]]261;262 %signbit = lshr i32 %x, 31263 %isneg = icmp ne i32 %signbit, 0264 ret i1 %isneg265}266define i1 @unsigned_sign_bit_extract_extrause(i32 %x) {267; CHECK-LABEL: @unsigned_sign_bit_extract_extrause(268; CHECK-NEXT: [[SIGNBIT:%.*]] = lshr i32 [[X:%.*]], 31269; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]])270; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X]], 0271; CHECK-NEXT: ret i1 [[ISNEG]]272;273 %signbit = lshr i32 %x, 31274 call void @use32(i32 %signbit)275 %isneg = icmp ne i32 %signbit, 0276 ret i1 %isneg277}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:%.*]], 31281; CHECK-NEXT: call void @use32(i32 [[SIGNBIT]])282; CHECK-NEXT: [[ISNEG:%.*]] = icmp sgt i32 [[X]], -1283; CHECK-NEXT: ret i1 [[ISNEG]]284;285 %signbit = lshr i32 %x, 31286 call void @use32(i32 %signbit)287 %isneg = icmp eq i32 %signbit, 0288 ret i1 %isneg289}290define i1 @signed_sign_bit_extract(i32 %x) {291; CHECK-LABEL: @signed_sign_bit_extract(292; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X:%.*]], 0293; CHECK-NEXT: ret i1 [[ISNEG]]294;295 %signsmear = ashr i32 %x, 31296 %isneg = icmp ne i32 %signsmear, 0297 ret i1 %isneg298}299define i1 @signed_sign_bit_extract_extrause(i32 %x) {300; CHECK-LABEL: @signed_sign_bit_extract_extrause(301; CHECK-NEXT: [[SIGNSMEAR:%.*]] = ashr i32 [[X:%.*]], 31302; CHECK-NEXT: call void @use32(i32 [[SIGNSMEAR]])303; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i32 [[X]], 0304; CHECK-NEXT: ret i1 [[ISNEG]]305;306 %signsmear = ashr i32 %x, 31307 call void @use32(i32 %signsmear)308 %isneg = icmp ne i32 %signsmear, 0309 ret i1 %isneg310}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:%.*]], 0314; CHECK-NEXT: ret i1 [[ISNEG]]315;316 %signbit = lshr i64 %x, 63317 %signbit_narrow = trunc i64 %signbit to i32318 %isneg = icmp ne i32 %signbit_narrow, 0319 ret i1 %isneg320}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:%.*]], 63324; CHECK-NEXT: call void @use64(i64 [[SIGNBIT]])325; CHECK-NEXT: [[SIGNBIT_NARROW:%.*]] = trunc nuw nsw i64 [[SIGNBIT]] to i32326; CHECK-NEXT: call void @use32(i32 [[SIGNBIT_NARROW]])327; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X]], 0328; CHECK-NEXT: ret i1 [[ISNEG]]329;330 %signbit = lshr i64 %x, 63331 call void @use64(i64 %signbit)332 %signbit_narrow = trunc i64 %signbit to i32333 call void @use32(i32 %signbit_narrow)334 %isneg = icmp ne i32 %signbit_narrow, 0335 ret i1 %isneg336}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:%.*]], 0340; CHECK-NEXT: ret i1 [[ISNEG]]341;342 %signsmear = ashr i64 %x, 63343 %signsmear_narrow = trunc i64 %signsmear to i32344 %isneg = icmp ne i32 %signsmear_narrow, 0345 ret i1 %isneg346}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:%.*]], 63350; CHECK-NEXT: call void @use64(i64 [[SIGNSMEAR]])351; CHECK-NEXT: [[SIGNSMEAR_NARROW:%.*]] = trunc nsw i64 [[SIGNSMEAR]] to i32352; CHECK-NEXT: call void @use32(i32 [[SIGNSMEAR_NARROW]])353; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i64 [[X]], 0354; CHECK-NEXT: ret i1 [[ISNEG]]355;356 %signsmear = ashr i64 %x, 63357 call void @use64(i64 %signsmear)358 %signsmear_narrow = trunc i64 %signsmear to i32359 call void @use32(i32 %signsmear_narrow)360 %isneg = icmp ne i32 %signsmear_narrow, 0361 ret i1 %isneg362}363