153 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown < %s | FileCheck %s --check-prefix=X64 --check-prefix=X64-ALL2; RUN: llc -verify-machineinstrs -mtriple=x86_64-unknown --x86-lvi-load-no-cbranch < %s | FileCheck %s --check-prefix=X643; RUN: llc -O0 -verify-machineinstrs -mtriple=x86_64-unknown < %s | FileCheck %s --check-prefix=X64-NOOPT4 5; Function Attrs: noinline nounwind optnone uwtable6define dso_local i32 @test(ptr %secret, i32 %secret_size) #0 {7; X64-LABEL: test:8entry:9 %secret.addr = alloca ptr, align 810 %secret_size.addr = alloca i32, align 411 %ret_val = alloca i32, align 412 %i = alloca i32, align 413 store ptr %secret, ptr %secret.addr, align 814 store i32 %secret_size, ptr %secret_size.addr, align 415 store i32 0, ptr %ret_val, align 416 call void @llvm.x86.sse2.lfence()17 store i32 0, ptr %i, align 418 br label %for.cond19 20; X64: # %bb.0: # %entry21; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp)22; X64-NEXT: movl %esi, -{{[0-9]+}}(%rsp)23; X64-NEXT: movl $0, -{{[0-9]+}}(%rsp)24; X64-NEXT: lfence25; X64-NEXT: movl $0, -{{[0-9]+}}(%rsp)26; X64-NEXT: jmp .LBB0_127 28; X64-NOOPT: # %bb.0: # %entry29; X64-NOOPT-NEXT: lfence30; X64-NOOPT-NEXT: movq %rdi, -{{[0-9]+}}(%rsp)31; X64-NOOPT-NEXT: lfence32; X64-NOOPT-NEXT: movl %esi, -{{[0-9]+}}(%rsp)33; X64-NOOPT-NEXT: lfence34; X64-NOOPT-NEXT: movl $0, -{{[0-9]+}}(%rsp)35; X64-NOOPT-NEXT: lfence36; X64-NOOPT-NEXT: movl $0, -{{[0-9]+}}(%rsp)37 38for.cond: ; preds = %for.inc, %entry39 %0 = load i32, ptr %i, align 440 %1 = load i32, ptr %secret_size.addr, align 441 %cmp = icmp slt i32 %0, %142 br i1 %cmp, label %for.body, label %for.end43 44; X64: .LBB0_1: # %for.cond45; X64-NEXT: # =>This Inner Loop Header: Depth=146; X64-NEXT: movl -{{[0-9]+}}(%rsp), %eax47; X64-ALL-NEXT: lfence48; X64-NEXT: cmpl -{{[0-9]+}}(%rsp), %eax49; X64-ALL-NEXT: lfence50; X64-NEXT: jge .LBB0_551 52; X64-NOOPT: .LBB0_1: # %for.cond53; X64-NOOPT-NEXT: # =>This Inner Loop Header: Depth=154; X64-NOOPT-NEXT: lfence55; X64-NOOPT-NEXT: movl -{{[0-9]+}}(%rsp), %eax56; X64-NOOPT-NEXT: lfence57; X64-NOOPT-NEXT: cmpl -{{[0-9]+}}(%rsp), %eax58; X64-NOOPT-NEXT: lfence59; X64-NOOPT-NEXT: jge .LBB0_660 61for.body: ; preds = %for.cond62 %2 = load i32, ptr %i, align 463 %rem = srem i32 %2, 264 %cmp1 = icmp eq i32 %rem, 065 br i1 %cmp1, label %if.then, label %if.end66 67; X64: # %bb.2: # %for.body68; X64-NEXT: # in Loop: Header=BB0_1 Depth=169; X64-NEXT: movl -{{[0-9]+}}(%rsp), %eax70; X64-ALL-NEXT: lfence71; X64-NEXT: movl %eax, %ecx72; X64-NEXT: shrl $31, %ecx73; X64-NEXT: addl %eax, %ecx74; X64-NEXT: andl $-2, %ecx75; X64-NEXT: cmpl %ecx, %eax76; X64-NEXT: jne .LBB0_477 78; X64-NOOPT: # %bb.2: # %for.body79; X64-NOOPT-NEXT: # in Loop: Header=BB0_1 Depth=180; X64-NOOPT-NEXT: lfence81; X64-NOOPT-NEXT: movl -{{[0-9]+}}(%rsp), %eax82; X64-NOOPT-NEXT: movl $2, %ecx83; X64-NOOPT-NEXT: cltd84; X64-NOOPT-NEXT: idivl %ecx85; X64-NOOPT-NEXT: cmpl $0, %edx86; X64-NOOPT-NEXT: lfence87; X64-NOOPT-NEXT: jne .LBB0_488 89if.then: ; preds = %for.body90 %3 = load ptr, ptr %secret.addr, align 891 %4 = load i32, ptr %ret_val, align 492 %idxprom = sext i32 %4 to i6493 %arrayidx = getelementptr inbounds ptr, ptr %3, i64 %idxprom94 %5 = load ptr, ptr %arrayidx, align 895 %6 = load i32, ptr %5, align 496 store i32 %6, ptr %ret_val, align 497 br label %if.end98 99; X64: # %bb.3: # %if.then100; X64-NEXT: # in Loop: Header=BB0_1 Depth=1101; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax102; X64-NEXT: lfence103; X64-NEXT: movslq -{{[0-9]+}}(%rsp), %rcx104; X64-NEXT: lfence105; X64-NEXT: movq (%rax,%rcx,8), %rax106; X64-NEXT: lfence107; X64-NEXT: movl (%rax), %eax108; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp)109; X64-NEXT: jmp .LBB0_4110 111; X64-NOOPT: # %bb.3: # %if.then112; X64-NOOPT-NEXT: # in Loop: Header=BB0_1 Depth=1113; X64-NOOPT-NEXT: lfence114; X64-NOOPT-NEXT: movq -{{[0-9]+}}(%rsp), %rax115; X64-NOOPT-NEXT: lfence116; X64-NOOPT-NEXT: movslq -{{[0-9]+}}(%rsp), %rcx117; X64-NOOPT-NEXT: lfence118; X64-NOOPT-NEXT: movq (%rax,%rcx,8), %rax119; X64-NOOPT-NEXT: lfence120; X64-NOOPT-NEXT: movl (%rax), %eax121; X64-NOOPT-NEXT: lfence122; X64-NOOPT-NEXT: movl %eax, -{{[0-9]+}}(%rsp)123 124if.end: ; preds = %if.then, %for.body125 br label %for.inc126 127for.inc: ; preds = %if.end128 %7 = load i32, ptr %i, align 4129 %inc = add nsw i32 %7, 1130 store i32 %inc, ptr %i, align 4131 br label %for.cond132 133; X64-NOOPT: .LBB0_5: # %for.inc134; X64-NOOPT-NEXT: # in Loop: Header=BB0_1 Depth=1135; X64-NOOPT-NEXT: lfence136; X64-NOOPT-NEXT: movl -{{[0-9]+}}(%rsp), %eax137; X64-NOOPT-NEXT: addl $1, %eax138; X64-NOOPT-NEXT: lfence139; X64-NOOPT-NEXT: movl %eax, -{{[0-9]+}}(%rsp)140; X64-NOOPT-NEXT: lfence141; X64-NOOPT-NEXT: jmp .LBB0_1142 143for.end: ; preds = %for.cond144 %8 = load i32, ptr %ret_val, align 4145 ret i32 %8146}147 148; Function Attrs: nounwind149declare void @llvm.x86.sse2.lfence() #1150 151attributes #0 = { "target-features"="+lvi-load-hardening" }152attributes #1 = { nounwind }153