85 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=x86_64 | FileCheck %s3 4define zeroext i32 @trunc_nuw_nsw_urem(i64 %x) nounwind {5; CHECK-LABEL: trunc_nuw_nsw_urem:6; CHECK: # %bb.0: # %entry7; CHECK-NEXT: movq %rdi, %rax8; CHECK-NEXT: movl $3518437209, %ecx # imm = 0xD1B717599; CHECK-NEXT: imulq %rdi, %rcx10; CHECK-NEXT: shrq $45, %rcx11; CHECK-NEXT: imull $10000, %ecx, %ecx # imm = 0x271012; CHECK-NEXT: subl %ecx, %eax13; CHECK-NEXT: # kill: def $eax killed $eax killed $rax14; CHECK-NEXT: retq15entry:16 %trunc = trunc nuw nsw i64 %x to i3217 %rem = urem i32 %trunc, 1000018 ret i32 %rem19}20 21define i64 @zext_nneg_udiv_trunc_nuw(i64 %x) nounwind {22; CHECK-LABEL: zext_nneg_udiv_trunc_nuw:23; CHECK: # %bb.0: # %entry24; CHECK-NEXT: imull $52429, %edi, %eax # imm = 0xCCCD25; CHECK-NEXT: shrl $23, %eax26; CHECK-NEXT: retq27entry:28 %trunc = trunc nuw i64 %x to i1629 %div = udiv i16 %trunc, 16030 %ext = zext nneg i16 %div to i6431 ret i64 %ext32}33 34define i64 @sext_udiv_trunc_nuw(i64 %x) nounwind {35; CHECK-LABEL: sext_udiv_trunc_nuw:36; CHECK: # %bb.0: # %entry37; CHECK-NEXT: imull $52429, %edi, %eax # imm = 0xCCCD38; CHECK-NEXT: shrl $23, %eax39; CHECK-NEXT: retq40entry:41 %trunc = trunc nuw i64 %x to i1642 %div = udiv i16 %trunc, 16043 %ext = sext i16 %div to i6444 ret i64 %ext45}46 47define ptr @gep_nusw_zext_nneg_add_trunc_nuw_nsw(ptr %p, i64 %x) nounwind {48; CHECK-LABEL: gep_nusw_zext_nneg_add_trunc_nuw_nsw:49; CHECK: # %bb.0: # %entry50; CHECK-NEXT: leaq 20(%rdi,%rsi,4), %rax51; CHECK-NEXT: retq52entry:53 %trunc = trunc nuw nsw i64 %x to i3254 %add = add nuw nsw i32 %trunc, 555 %offset = zext nneg i32 %add to i6456 %gep = getelementptr nusw float, ptr %p, i64 %offset57 ret ptr %gep58}59 60; Make sure nsw flag is dropped after we simplify the operand of TRUNCATE.61 62define i32 @simplify_demanded_bits_drop_flag(i1 zeroext %x, i1 zeroext %y) nounwind {63; CHECK-LABEL: simplify_demanded_bits_drop_flag:64; CHECK: # %bb.0: # %entry65; CHECK-NEXT: # kill: def $esi killed $esi def $rsi66; CHECK-NEXT: shll $2, %esi67; CHECK-NEXT: movl %edi, %eax68; CHECK-NEXT: negq %rax69; CHECK-NEXT: xorq %rsi, %rax70; CHECK-NEXT: imulq $-1634202141, %rax, %rax # imm = 0x9E980DE371; CHECK-NEXT: movq %rax, %rcx72; CHECK-NEXT: shrq $63, %rcx73; CHECK-NEXT: sarq $44, %rax74; CHECK-NEXT: addl %ecx, %eax75; CHECK-NEXT: # kill: def $eax killed $eax killed $rax76; CHECK-NEXT: retq77entry:78 %sel = select i1 %y, i64 4, i64 079 %conv0 = sext i1 %x to i6480 %xor = xor i64 %sel, %conv081 %conv1 = trunc nsw i64 %xor to i3282 %div = sdiv i32 %conv1, -1076583 ret i32 %div84}85