Skip to content

Commit 95e44d3

Browse files
[msan] Add handling for sse41_round_pd/sse41_round_ps (#118441)
Add handling for sse41_round_pd/sse41_round_ps similarly to maybeHandleSimpleNomemIntrinsic. Test plan: ninja check-all
1 parent 66ed8fb commit 95e44d3

File tree

3 files changed

+25
-32
lines changed

3 files changed

+25
-32
lines changed

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3832,6 +3832,21 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
38323832
setOriginForNaryOp(I);
38333833
}
38343834

3835+
// _mm_round_ps / _mm_round_ps.
3836+
// Similar to maybeHandleSimpleNomemIntrinsic except
3837+
// the second argument is guranteed to be a constant integer.
3838+
void handleRoundPdPsIntrinsic(IntrinsicInst &I) {
3839+
assert(I.getArgOperand(0)->getType() == I.getType());
3840+
unsigned NumArgOperands = I.arg_size();
3841+
assert(NumArgOperands == 2);
3842+
assert(isa<ConstantInt>(I.getArgOperand(1)));
3843+
3844+
IRBuilder<> IRB(&I);
3845+
ShadowAndOriginCombiner SC(this, IRB);
3846+
SC.Add(I.getArgOperand(0));
3847+
SC.Done(&I);
3848+
}
3849+
38353850
// Instrument abs intrinsic.
38363851
// handleUnknownIntrinsic can't handle it because of the last
38373852
// is_int_min_poison argument which does not match the result type.
@@ -4327,10 +4342,16 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
43274342
handlePclmulIntrinsic(I);
43284343
break;
43294344

4345+
case Intrinsic::x86_sse41_round_pd:
4346+
case Intrinsic::x86_sse41_round_ps:
4347+
handleRoundPdPsIntrinsic(I);
4348+
break;
4349+
43304350
case Intrinsic::x86_sse41_round_sd:
43314351
case Intrinsic::x86_sse41_round_ss:
43324352
handleUnarySdSsIntrinsic(I);
43334353
break;
4354+
43344355
case Intrinsic::x86_sse2_max_sd:
43354356
case Intrinsic::x86_sse_max_ss:
43364357
case Intrinsic::x86_sse2_min_sd:

llvm/test/Instrumentation/MemorySanitizer/X86/sse41-intrinsics-x86.ll

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -320,15 +320,8 @@ define <2 x double> @test_x86_sse41_round_pd(<2 x double> %a0) #0 {
320320
; CHECK-LABEL: @test_x86_sse41_round_pd(
321321
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
322322
; CHECK-NEXT: call void @llvm.donothing()
323-
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
324-
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
325-
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
326-
; CHECK: 3:
327-
; CHECK-NEXT: call void @__msan_warning_noreturn()
328-
; CHECK-NEXT: unreachable
329-
; CHECK: 4:
330323
; CHECK-NEXT: [[RES:%.*]] = call <2 x double> @llvm.x86.sse41.round.pd(<2 x double> [[A0:%.*]], i32 7)
331-
; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 8
324+
; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr @__msan_retval_tls, align 8
332325
; CHECK-NEXT: ret <2 x double> [[RES]]
333326
;
334327
%res = call <2 x double> @llvm.x86.sse41.round.pd(<2 x double> %a0, i32 7) ; <<2 x double>> [#uses=1]
@@ -341,15 +334,8 @@ define <4 x float> @test_x86_sse41_round_ps(<4 x float> %a0) #0 {
341334
; CHECK-LABEL: @test_x86_sse41_round_ps(
342335
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
343336
; CHECK-NEXT: call void @llvm.donothing()
344-
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
345-
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
346-
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]
347-
; CHECK: 3:
348-
; CHECK-NEXT: call void @__msan_warning_noreturn()
349-
; CHECK-NEXT: unreachable
350-
; CHECK: 4:
351337
; CHECK-NEXT: [[RES:%.*]] = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> [[A0:%.*]], i32 7)
352-
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr @__msan_retval_tls, align 8
338+
; CHECK-NEXT: store <4 x i32> [[TMP1]], ptr @__msan_retval_tls, align 8
353339
; CHECK-NEXT: ret <4 x float> [[RES]]
354340
;
355341
%res = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> %a0, i32 7) ; <<4 x float>> [#uses=1]

llvm/test/Instrumentation/MemorySanitizer/i386/sse41-intrinsics-i386.ll

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -335,15 +335,8 @@ define <2 x double> @test_x86_sse41_round_pd(<2 x double> %a0) #0 {
335335
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
336336
; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 8
337337
; CHECK-NEXT: call void @llvm.donothing()
338-
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
339-
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
340-
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP6:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
341-
; CHECK: 4:
342-
; CHECK-NEXT: call void @__msan_warning_noreturn()
343-
; CHECK-NEXT: unreachable
344-
; CHECK: 5:
345338
; CHECK-NEXT: [[RES:%.*]] = call <2 x double> @llvm.x86.sse41.round.pd(<2 x double> [[A0:%.*]], i32 7)
346-
; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr @__msan_retval_tls, align 8
339+
; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr @__msan_retval_tls, align 8
347340
; CHECK-NEXT: ret <2 x double> [[RES]]
348341
;
349342
%res = call <2 x double> @llvm.x86.sse41.round.pd(<2 x double> %a0, i32 7) ; <<2 x double>> [#uses=1]
@@ -357,15 +350,8 @@ define <4 x float> @test_x86_sse41_round_ps(<4 x float> %a0) #0 {
357350
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
358351
; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 8
359352
; CHECK-NEXT: call void @llvm.donothing()
360-
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
361-
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP2]], 0
362-
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP6:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]
363-
; CHECK: 4:
364-
; CHECK-NEXT: call void @__msan_warning_noreturn()
365-
; CHECK-NEXT: unreachable
366-
; CHECK: 5:
367353
; CHECK-NEXT: [[RES:%.*]] = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> [[A0:%.*]], i32 7)
368-
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr @__msan_retval_tls, align 8
354+
; CHECK-NEXT: store <4 x i32> [[TMP1]], ptr @__msan_retval_tls, align 8
369355
; CHECK-NEXT: ret <4 x float> [[RES]]
370356
;
371357
%res = call <4 x float> @llvm.x86.sse41.round.ps(<4 x float> %a0, i32 7) ; <<4 x float>> [#uses=1]

0 commit comments

Comments
 (0)