139 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=core-avx-i -mattr=+rdrnd | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=core-avx-i -mattr=+rdrnd | FileCheck %s --check-prefix=X644 5declare {i16, i32} @llvm.x86.rdrand.16()6declare {i32, i32} @llvm.x86.rdrand.32()7 8define i32 @_rdrand16_step(ptr %random_val) {9; X86-LABEL: _rdrand16_step:10; X86: # %bb.0:11; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx12; X86-NEXT: rdrandw %ax13; X86-NEXT: movzwl %ax, %edx14; X86-NEXT: movl $1, %eax15; X86-NEXT: cmovael %edx, %eax16; X86-NEXT: movw %dx, (%ecx)17; X86-NEXT: retl18;19; X64-LABEL: _rdrand16_step:20; X64: # %bb.0:21; X64-NEXT: rdrandw %ax22; X64-NEXT: movzwl %ax, %ecx23; X64-NEXT: movl $1, %eax24; X64-NEXT: cmovael %ecx, %eax25; X64-NEXT: movw %cx, (%rdi)26; X64-NEXT: retq27 %call = call {i16, i32} @llvm.x86.rdrand.16()28 %randval = extractvalue {i16, i32} %call, 029 store i16 %randval, ptr %random_val30 %isvalid = extractvalue {i16, i32} %call, 131 ret i32 %isvalid32}33 34define i32 @_rdrand32_step(ptr %random_val) {35; X86-LABEL: _rdrand32_step:36; X86: # %bb.0:37; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx38; X86-NEXT: rdrandl %edx39; X86-NEXT: movl $1, %eax40; X86-NEXT: cmovael %edx, %eax41; X86-NEXT: movl %edx, (%ecx)42; X86-NEXT: retl43;44; X64-LABEL: _rdrand32_step:45; X64: # %bb.0:46; X64-NEXT: rdrandl %ecx47; X64-NEXT: movl $1, %eax48; X64-NEXT: cmovael %ecx, %eax49; X64-NEXT: movl %ecx, (%rdi)50; X64-NEXT: retq51 %call = call {i32, i32} @llvm.x86.rdrand.32()52 %randval = extractvalue {i32, i32} %call, 053 store i32 %randval, ptr %random_val54 %isvalid = extractvalue {i32, i32} %call, 155 ret i32 %isvalid56}57 58; Check that MachineCSE doesn't eliminate duplicate rdrand instructions.59define i32 @CSE() nounwind {60; X86-LABEL: CSE:61; X86: # %bb.0:62; X86-NEXT: rdrandl %ecx63; X86-NEXT: rdrandl %eax64; X86-NEXT: addl %ecx, %eax65; X86-NEXT: retl66;67; X64-LABEL: CSE:68; X64: # %bb.0:69; X64-NEXT: rdrandl %ecx70; X64-NEXT: rdrandl %eax71; X64-NEXT: addl %ecx, %eax72; X64-NEXT: retq73 %rand1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind74 %v1 = extractvalue { i32, i32 } %rand1, 075 %rand2 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind76 %v2 = extractvalue { i32, i32 } %rand2, 077 %add = add i32 %v2, %v178 ret i32 %add79}80 81; Check that MachineLICM doesn't hoist rdrand instructions.82define void @loop(ptr %p, i32 %n) nounwind {83; X86-LABEL: loop:84; X86: # %bb.0: # %entry85; X86-NEXT: pushl %esi86; X86-NEXT: movl {{[0-9]+}}(%esp), %eax87; X86-NEXT: testl %eax, %eax88; X86-NEXT: je .LBB3_389; X86-NEXT: # %bb.1: # %while.body.preheader90; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx91; X86-NEXT: xorl %edx, %edx92; X86-NEXT: .p2align 493; X86-NEXT: .LBB3_2: # %while.body94; X86-NEXT: # =>This Inner Loop Header: Depth=195; X86-NEXT: rdrandl %esi96; X86-NEXT: movl %esi, (%ecx,%edx,4)97; X86-NEXT: incl %edx98; X86-NEXT: cmpl %edx, %eax99; X86-NEXT: jne .LBB3_2100; X86-NEXT: .LBB3_3: # %while.end101; X86-NEXT: popl %esi102; X86-NEXT: retl103;104; X64-LABEL: loop:105; X64: # %bb.0: # %entry106; X64-NEXT: testl %esi, %esi107; X64-NEXT: je .LBB3_3108; X64-NEXT: # %bb.1: # %while.body.preheader109; X64-NEXT: movl %esi, %eax110; X64-NEXT: xorl %ecx, %ecx111; X64-NEXT: .p2align 4112; X64-NEXT: .LBB3_2: # %while.body113; X64-NEXT: # =>This Inner Loop Header: Depth=1114; X64-NEXT: rdrandl %edx115; X64-NEXT: movl %edx, (%rdi,%rcx,4)116; X64-NEXT: incq %rcx117; X64-NEXT: cmpl %ecx, %eax118; X64-NEXT: jne .LBB3_2119; X64-NEXT: .LBB3_3: # %while.end120; X64-NEXT: retq121entry:122 %tobool1 = icmp eq i32 %n, 0123 br i1 %tobool1, label %while.end, label %while.body124 125while.body: ; preds = %entry, %while.body126 %p.addr.03 = phi ptr [ %incdec.ptr, %while.body ], [ %p, %entry ]127 %n.addr.02 = phi i32 [ %dec, %while.body ], [ %n, %entry ]128 %dec = add nsw i32 %n.addr.02, -1129 %incdec.ptr = getelementptr inbounds i32, ptr %p.addr.03, i64 1130 %rand = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind131 %v1 = extractvalue { i32, i32 } %rand, 0132 store i32 %v1, ptr %p.addr.03, align 4133 %tobool = icmp eq i32 %dec, 0134 br i1 %tobool, label %while.end, label %while.body135 136while.end: ; preds = %while.body, %entry137 ret void138}139