brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · cb445b4 Raw
153 lines · plain
1; RUN: sed -e 's/SLHATTR/speculative_load_hardening/' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu | FileCheck %s --check-prefixes=CHECK,SLH2; RUN: sed -e 's/SLHATTR//' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu | FileCheck %s --check-prefixes=CHECK,NOSLH3; RUN: sed -e 's/SLHATTR/speculative_load_hardening/' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -global-isel | FileCheck %s --check-prefixes=CHECK,SLH4; RUN: sed -e 's/SLHATTR//' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -global-isel | FileCheck %s --check-prefixes=CHECK,NOSLH5; RUN: sed -e 's/SLHATTR/speculative_load_hardening/' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -fast-isel | FileCheck %s --check-prefixes=CHECK,SLH6; RUN: sed -e 's/SLHATTR//' %s | llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -fast-isel | FileCheck %s --check-prefixes=CHECK,NOSLH7 8define i32 @f(ptr nocapture readonly %p, i32 %i, i32 %N) local_unnamed_addr SLHATTR {9; CHECK-LABEL: f10entry:11; SLH:  cmp sp, #012; SLH:  csetm x16, ne13; NOSLH-NOT:  cmp sp, #014; NOSLH-NOT:  csetm x16, ne15 16; SLH:  mov [[TMPREG:x[0-9]+]], sp17; SLH:  and [[TMPREG]], [[TMPREG]], x1618; SLH:  mov sp, [[TMPREG]]19; NOSLH-NOT:  mov {{x[0-9]+}}, sp20; NOSLH-NOT:  and [[TMPREG:x[0-9]+]], [[TMPREG]], x1621; NOSLH-NOT:  mov sp, {{x[0-9]+}}22  %call = tail call i32 @tail_callee(i32 %i)23; SLH:  cmp sp, #024; SLH:  csetm x16, ne25; NOSLH-NOT:  cmp sp, #026; NOSLH-NOT:  csetm x16, ne27  %cmp = icmp slt i32 %call, %N28  br i1 %cmp, label %if.then, label %return29; CHECK: b.[[COND:(ge)|(lt)|(ne)|(eq)]]30 31if.then:                                          ; preds = %entry32; NOSLH-NOT: csel x16, x16, xzr, {{(lt)|(ge)|(eq)|(ne)}}33; SLH-DAG: csel x16, x16, xzr, {{(lt)|(ge)|(eq)|(ne)}}34  %idxprom = sext i32 %i to i6435  %arrayidx = getelementptr inbounds i8, ptr %p, i64 %idxprom36  %0 = load i8, ptr %arrayidx, align 137; CHECK-DAG:      ldrb [[LOADED:w[0-9]+]],38  %conv = zext i8 %0 to i3239  br label %return40 41; SLH-DAG: csel x16, x16, xzr, [[COND]]42; NOSLH-NOT: csel x16, x16, xzr, [[COND]]43return:                                           ; preds = %entry, %if.then44  %retval.0 = phi i32 [ %conv, %if.then ], [ 0, %entry ]45; SLH:  mov [[TMPREG:x[0-9]+]], sp46; SLH:  and [[TMPREG]], [[TMPREG]], x1647; SLH:  mov sp, [[TMPREG]]48; NOSLH-NOT:  mov {{x[0-9]+}}, sp49; NOSLH-NOT:  and [[TMPREG:x[0-9]+]], [[TMPREG]], x1650; NOSLH-NOT:  mov sp, {{x[0-9]+}}51  ret i32 %retval.052}53 54; Make sure that for a tail call, taint doesn't get put into SP twice.55define i32 @tail_caller(i32 %a) local_unnamed_addr SLHATTR {56; CHECK-LABEL: tail_caller:57; SLH:     mov [[TMPREG:x[0-9]+]], sp58; SLH:     and [[TMPREG]], [[TMPREG]], x1659; SLH:     mov sp, [[TMPREG]]60; NOSLH-NOT:     mov {{x[0-9]+}}, sp61; NOSLH-NOT:     and [[TMPREG:x[0-9]+]], [[TMPREG]], x1662; NOSLH-NOT:     mov sp, {{x[0-9]+}}63; SLH:     b tail_callee64; SLH-NOT:        cmp sp, #065  %call = tail call i32 @tail_callee(i32 %a)66  ret i32 %call67}68 69declare i32 @tail_callee(i32) local_unnamed_addr70 71; Verify that no cb(n)z/tb(n)z instructions are produced when implementing72; SLH73define i32 @compare_branch_zero(i32, i32) SLHATTR {74; CHECK-LABEL: compare_branch_zero75  %3 = icmp eq i32 %0, 076  br i1 %3, label %then, label %else77;SLH-NOT:   cb{{n?}}z78;NOSLH:     cb{{n?}}z79then:80  %4 = sdiv i32 5, %181  ret i32 %482else:83  %5 = sdiv i32 %1, %084  ret i32 %585}86 87define i32 @test_branch_zero(i32, i32) SLHATTR {88; CHECK-LABEL: test_branch_zero89  %3 = and i32 %0, 1690  %4 = icmp eq i32 %3, 091  br i1 %4, label %then, label %else92;SLH-NOT:   tb{{n?}}z93;NOSLH:     tb{{n?}}z94then:95  %5 = sdiv i32 5, %196  ret i32 %597else:98  %6 = sdiv i32 %1, %099  ret i32 %6100}101 102define i32 @landingpad(i32 %l0, i32 %l1) SLHATTR personality ptr @__gxx_personality_v0 {103; CHECK-LABEL: landingpad104entry:105; SLH:  cmp sp, #0106; SLH:  csetm x16, ne107; NOSLH-NOT:  cmp sp, #0108; NOSLH-NOT:  csetm x16, ne109; CHECK: bl _Z10throwing_fv110  invoke void @_Z10throwing_fv()111          to label %exit unwind label %lpad112; SLH:  cmp sp, #0113; SLH:  csetm x16, ne114 115lpad:116  %l4 = landingpad { ptr, i32 }117          catch ptr null118; SLH:  cmp sp, #0119; SLH:  csetm x16, ne120; NOSLH-NOT:  cmp sp, #0121; NOSLH-NOT:  csetm x16, ne122  %l5 = extractvalue { ptr, i32 } %l4, 0123  %l6 = tail call ptr @__cxa_begin_catch(ptr %l5)124  %l7 = icmp sgt i32 %l0, %l1125  br i1 %l7, label %then, label %else126; GlobalISel lowers the branch to a b.ne sometimes instead of b.ge as expected..127; CHECK: b.[[COND:(le)|(gt)|(ne)|(eq)]]128 129then:130; SLH-DAG: csel x16, x16, xzr, [[COND]]131  %l9 = sdiv i32 %l0, %l1132  br label %postif133 134else:135; SLH-DAG: csel x16, x16, xzr, {{(gt)|(le)|(eq)|(ne)}}136  %l11 = sdiv i32 %l1, %l0137  br label %postif138 139postif:140  %l13 = phi i32 [ %l9, %then ], [ %l11, %else ]141  tail call void @__cxa_end_catch()142  br label %exit143 144exit:145  %l15 = phi i32 [ %l13, %postif ], [ 0, %entry ]146  ret i32 %l15147}148 149declare i32 @__gxx_personality_v0(...)150declare void @_Z10throwing_fv() local_unnamed_addr151declare ptr @__cxa_begin_catch(ptr) local_unnamed_addr152declare void @__cxa_end_catch() local_unnamed_addr153