brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.2 KiB · 30fad66 Raw
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