Skip to content

Commit 1e23175

Browse files
committed
[PowerPC] Mark side effects of Power9 darn instruction
This fixes CVE-2019-15847, preventing random number generation from being merged. Reviewed By: lkail Differential Revision: https://reviews.llvm.org/D122783
1 parent 4ffd0b6 commit 1e23175

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

llvm/include/llvm/IR/IntrinsicsPowerPC.td

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.".
6363

6464
// Generate a random number
6565
def int_ppc_darn : GCCBuiltin<"__builtin_darn">,
66-
Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>;
66+
Intrinsic<[llvm_i64_ty], [],
67+
[IntrNoMerge, IntrHasSideEffects]>;
6768
def int_ppc_darnraw : GCCBuiltin<"__builtin_darn_raw">,
68-
Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>;
69+
Intrinsic<[llvm_i64_ty], [],
70+
[IntrNoMerge, IntrHasSideEffects]>;
6971
def int_ppc_darn32 : GCCBuiltin<"__builtin_darn_32">,
70-
Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
72+
Intrinsic<[llvm_i32_ty], [],
73+
[IntrNoMerge, IntrHasSideEffects]>;
7174

7275
// Bit permute doubleword
7376
def int_ppc_bpermd : GCCBuiltin<"__builtin_bpermd">,

llvm/lib/Target/PowerPC/PPCInstr64Bit.td

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,8 +1014,6 @@ let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
10141014
def SETB8 : XForm_44<31, 128, (outs g8rc:$RT), (ins crrc:$BFA),
10151015
"setb $RT, $BFA", IIC_IntGeneral>, isPPC64;
10161016
}
1017-
def DARN : XForm_45<31, 755, (outs g8rc:$RT), (ins u2imm:$L),
1018-
"darn $RT, $L", IIC_LdStLD>, isPPC64;
10191017
def ADDPCIS : DXForm<19, 2, (outs g8rc:$RT), (ins i32imm:$D),
10201018
"addpcis $RT, $D", IIC_BrB, []>, isPPC64;
10211019
def MODSD : XForm_8<31, 777, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
@@ -1040,6 +1038,11 @@ def MULLI8 : DForm_2<7, (outs g8rc:$rD), (ins g8rc:$rA, s16imm64:$imm),
10401038
[(set i64:$rD, (mul i64:$rA, imm64SExt16:$imm))]>;
10411039
}
10421040

1041+
let hasSideEffects = 1 in {
1042+
def DARN : XForm_45<31, 755, (outs g8rc:$RT), (ins u2imm:$L),
1043+
"darn $RT, $L", IIC_LdStLD>, isPPC64;
1044+
}
1045+
10431046
let hasSideEffects = 0 in {
10441047
defm RLDIMI : MDForm_1r<30, 3, (outs g8rc:$rA),
10451048
(ins g8rc:$rSi, g8rc:$rS, u6imm:$SH, u6imm:$MBE),

llvm/test/CodeGen/PowerPC/builtins-ppc-p9-darn.ll

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc < %s -verify-machineinstrs -mtriple powerpc64le -mcpu=pwr9 | FileCheck %s
33
; RUN: llc < %s -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -vec-extabi -mcpu=pwr9 | FileCheck %s
4+
; RUN: opt < %s -passes="default<O3>" -S -mtriple powerpc64le -mcpu=pwr9 | FileCheck %s --check-prefix=OPT
45

56
define i64 @raw() {
67
; CHECK-LABEL: raw:
@@ -33,6 +34,52 @@ entry:
3334
ret i32 %0
3435
}
3536

37+
define i64 @darn_side_effect() {
38+
; CHECK-LABEL: darn_side_effect:
39+
; CHECK: # %bb.0: # %entry
40+
; CHECK-NEXT: darn 3, 2
41+
; CHECK-NEXT: darn 3, 1
42+
; CHECK-NEXT: blr
43+
44+
; OPT-LABEL: @darn_side_effect
45+
; OPT: call i64 @llvm.ppc.darnraw()
46+
; OPT-NEXT: call i64 @llvm.ppc.darn()
47+
entry:
48+
%0 = call i64 @llvm.ppc.darnraw()
49+
%1 = call i64 @llvm.ppc.darn()
50+
ret i64 %1
51+
}
52+
53+
define void @darn_loop(i64* noundef %darn) {
54+
; OPT-LABEL: @darn_loop
55+
; OPT-COUNT-32: tail call i64 @llvm.ppc.darn()
56+
entry:
57+
%inc = alloca i32, align 4
58+
store i32 0, i32* %inc, align 4
59+
br label %cond
60+
61+
cond:
62+
%0 = load i32, i32* %inc, align 4
63+
%cmp = icmp ne i32 %0, 32
64+
br i1 %cmp, label %body, label %end_loop
65+
66+
body:
67+
%1 = call i64 @llvm.ppc.darn()
68+
%2 = load i32, i32* %inc, align 4
69+
%idx = getelementptr inbounds i64, i64* %darn, i32 %2
70+
store i64 %1, i64* %idx, align 8
71+
br label %incr
72+
73+
incr:
74+
%3 = load i32, i32* %inc, align 4
75+
%ninc = add nsw i32 %3, 1
76+
store i32 %ninc, i32* %inc, align 4
77+
br label %cond
78+
79+
end_loop:
80+
ret void
81+
}
82+
3683
declare i64 @llvm.ppc.darn()
3784
declare i64 @llvm.ppc.darnraw()
3885
declare i32 @llvm.ppc.darn32()

0 commit comments

Comments
 (0)