xref: /llvm-project/llvm/test/Instrumentation/MemorySanitizer/count-zeroes.ll (revision 31bfa4a69b127bfb7217ceb67ca4deeddd6bf28b)
167ad31c8SKevin Athey; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
267ad31c8SKevin Athey; RUN: opt %s -S -passes=msan 2>&1 | FileCheck %s
367ad31c8SKevin Athey
467ad31c8SKevin Atheytarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
567ad31c8SKevin Atheytarget triple = "x86_64-unknown-linux-gnu"
667ad31c8SKevin Athey
767ad31c8SKevin Atheydeclare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone
867ad31c8SKevin Atheydefine i64 @test_ctlz_i64_zeropoison(i64 %v) #0 {
967ad31c8SKevin Athey; CHECK-LABEL: @test_ctlz_i64_zeropoison(
1067ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
1167ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
12*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne i64 [[TMP1]], 0
13*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BZP:%.*]] = icmp eq i64 [[V:%.*]], 0
14*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS1:%.*]] = or i1 [[_MSCZ_BS]], [[_MSCZ_BZP]]
15*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext i1 [[_MSCZ_BS1]] to i64
16*31bfa4a6SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call i64 @llvm.ctlz.i64(i64 [[V]], i1 true)
17*31bfa4a6SKevin Athey; CHECK-NEXT:    store i64 [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
1867ad31c8SKevin Athey; CHECK-NEXT:    ret i64 [[RES]]
1967ad31c8SKevin Athey;
2067ad31c8SKevin Athey  %res = call i64 @llvm.ctlz.i64(i64 %v, i1 true) ; <<i64>> [#uses=1]
2167ad31c8SKevin Athey  ret i64 %res
2267ad31c8SKevin Athey}
2367ad31c8SKevin Atheydefine i64 @test_ctlz_i64_nozeropoison(i64 %v) #0 {
2467ad31c8SKevin Athey; CHECK-LABEL: @test_ctlz_i64_nozeropoison(
2567ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
2667ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
27*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne i64 [[TMP1]], 0
28*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext i1 [[_MSCZ_BS]] to i64
2967ad31c8SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call i64 @llvm.ctlz.i64(i64 [[V:%.*]], i1 false)
30*31bfa4a6SKevin Athey; CHECK-NEXT:    store i64 [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
3167ad31c8SKevin Athey; CHECK-NEXT:    ret i64 [[RES]]
3267ad31c8SKevin Athey;
3367ad31c8SKevin Athey  %res = call i64 @llvm.ctlz.i64(i64 %v, i1 false) ; <<i64>> [#uses=1]
3467ad31c8SKevin Athey  ret i64 %res
3567ad31c8SKevin Athey}
3667ad31c8SKevin Athey
3767ad31c8SKevin Atheydeclare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) nounwind readnone
3867ad31c8SKevin Atheydefine <2 x i64> @test_ctlz_v2i64_zeropoison(<2 x i64> %v) #0 {
3967ad31c8SKevin Athey; CHECK-LABEL: @test_ctlz_v2i64_zeropoison(
4067ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
4167ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
42*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne <2 x i64> [[TMP1]], zeroinitializer
43*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BZP:%.*]] = icmp eq <2 x i64> [[V:%.*]], zeroinitializer
44*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS1:%.*]] = or <2 x i1> [[_MSCZ_BS]], [[_MSCZ_BZP]]
45*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext <2 x i1> [[_MSCZ_BS1]] to <2 x i64>
46*31bfa4a6SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[V]], i1 true)
47*31bfa4a6SKevin Athey; CHECK-NEXT:    store <2 x i64> [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
4867ad31c8SKevin Athey; CHECK-NEXT:    ret <2 x i64> [[RES]]
4967ad31c8SKevin Athey;
5067ad31c8SKevin Athey  %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %v, i1 true) ; <<2 x i64>> [#uses=1]
5167ad31c8SKevin Athey  ret <2 x i64> %res
5267ad31c8SKevin Athey}
5367ad31c8SKevin Atheydefine <2 x i64> @test_ctlz_v2i64_nozeropoison(<2 x i64> %v) #0 {
5467ad31c8SKevin Athey; CHECK-LABEL: @test_ctlz_v2i64_nozeropoison(
5567ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
5667ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
57*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne <2 x i64> [[TMP1]], zeroinitializer
58*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext <2 x i1> [[_MSCZ_BS]] to <2 x i64>
5967ad31c8SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> [[V:%.*]], i1 false)
60*31bfa4a6SKevin Athey; CHECK-NEXT:    store <2 x i64> [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
6167ad31c8SKevin Athey; CHECK-NEXT:    ret <2 x i64> [[RES]]
6267ad31c8SKevin Athey;
6367ad31c8SKevin Athey  %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %v, i1 false) ; <<2 x i64>> [#uses=1]
6467ad31c8SKevin Athey  ret <2 x i64> %res
6567ad31c8SKevin Athey}
6667ad31c8SKevin Athey
6767ad31c8SKevin Atheydeclare i64 @llvm.cttz.i64(i64, i1) nounwind readnone
6867ad31c8SKevin Atheydefine i64 @test_cttz_i64_zeropoison(i64 %v) #0 {
6967ad31c8SKevin Athey; CHECK-LABEL: @test_cttz_i64_zeropoison(
7067ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
7167ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
72*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne i64 [[TMP1]], 0
73*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BZP:%.*]] = icmp eq i64 [[V:%.*]], 0
74*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS1:%.*]] = or i1 [[_MSCZ_BS]], [[_MSCZ_BZP]]
75*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext i1 [[_MSCZ_BS1]] to i64
76*31bfa4a6SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call i64 @llvm.cttz.i64(i64 [[V]], i1 true)
77*31bfa4a6SKevin Athey; CHECK-NEXT:    store i64 [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
7867ad31c8SKevin Athey; CHECK-NEXT:    ret i64 [[RES]]
7967ad31c8SKevin Athey;
8067ad31c8SKevin Athey  %res = call i64 @llvm.cttz.i64(i64 %v, i1 true) ; <<i64>> [#uses=1]
8167ad31c8SKevin Athey  ret i64 %res
8267ad31c8SKevin Athey}
8367ad31c8SKevin Atheydefine i64 @test_cttz_i64_nozeropoison(i64 %v) #0 {
8467ad31c8SKevin Athey; CHECK-LABEL: @test_cttz_i64_nozeropoison(
8567ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
8667ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
87*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne i64 [[TMP1]], 0
88*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext i1 [[_MSCZ_BS]] to i64
8967ad31c8SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call i64 @llvm.cttz.i64(i64 [[V:%.*]], i1 false)
90*31bfa4a6SKevin Athey; CHECK-NEXT:    store i64 [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
9167ad31c8SKevin Athey; CHECK-NEXT:    ret i64 [[RES]]
9267ad31c8SKevin Athey;
9367ad31c8SKevin Athey  %res = call i64 @llvm.cttz.i64(i64 %v, i1 false) ; <<i64>> [#uses=1]
9467ad31c8SKevin Athey  ret i64 %res
9567ad31c8SKevin Athey}
9667ad31c8SKevin Athey
9767ad31c8SKevin Atheydeclare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1) nounwind readnone
9867ad31c8SKevin Atheydefine <2 x i64> @test_cttz_v2i64_zeropoison(<2 x i64> %v) #0 {
9967ad31c8SKevin Athey; CHECK-LABEL: @test_cttz_v2i64_zeropoison(
10067ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
10167ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
102*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne <2 x i64> [[TMP1]], zeroinitializer
103*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BZP:%.*]] = icmp eq <2 x i64> [[V:%.*]], zeroinitializer
104*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS1:%.*]] = or <2 x i1> [[_MSCZ_BS]], [[_MSCZ_BZP]]
105*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext <2 x i1> [[_MSCZ_BS1]] to <2 x i64>
106*31bfa4a6SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> [[V]], i1 true)
107*31bfa4a6SKevin Athey; CHECK-NEXT:    store <2 x i64> [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
10867ad31c8SKevin Athey; CHECK-NEXT:    ret <2 x i64> [[RES]]
10967ad31c8SKevin Athey;
11067ad31c8SKevin Athey  %res = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %v, i1 true) ; <<2 x i64>> [#uses=1]
11167ad31c8SKevin Athey  ret <2 x i64> %res
11267ad31c8SKevin Athey}
11367ad31c8SKevin Atheydefine <2 x i64> @test_cttz_v2i64_nozeropoison(<2 x i64> %v) #0 {
11467ad31c8SKevin Athey; CHECK-LABEL: @test_cttz_v2i64_nozeropoison(
11567ad31c8SKevin Athey; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8
11667ad31c8SKevin Athey; CHECK-NEXT:    call void @llvm.donothing()
117*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_BS:%.*]] = icmp ne <2 x i64> [[TMP1]], zeroinitializer
118*31bfa4a6SKevin Athey; CHECK-NEXT:    [[_MSCZ_OS:%.*]] = sext <2 x i1> [[_MSCZ_BS]] to <2 x i64>
11967ad31c8SKevin Athey; CHECK-NEXT:    [[RES:%.*]] = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> [[V:%.*]], i1 false)
120*31bfa4a6SKevin Athey; CHECK-NEXT:    store <2 x i64> [[_MSCZ_OS]], ptr @__msan_retval_tls, align 8
12167ad31c8SKevin Athey; CHECK-NEXT:    ret <2 x i64> [[RES]]
12267ad31c8SKevin Athey;
12367ad31c8SKevin Athey  %res = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %v, i1 false) ; <<2 x i64>> [#uses=1]
12467ad31c8SKevin Athey  ret <2 x i64> %res
12567ad31c8SKevin Athey}
12667ad31c8SKevin Athey
12767ad31c8SKevin Athey
12867ad31c8SKevin Atheyattributes #0 = { sanitize_memory }
129