brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · f1b6181 Raw
232 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=msan -S | FileCheck %s3;4; Forked from llvm/test/CodeGen/X86/bitreverse.ll5 6target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"7target triple = "x86_64-unknown-linux-gnu"8 9declare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone10 11define <2 x i16> @test_bitreverse_v2i16(<2 x i16> %a) nounwind #0 {12; CHECK-LABEL: define <2 x i16> @test_bitreverse_v2i16(13; CHECK-SAME: <2 x i16> [[A:%.*]]) #[[ATTR1:[0-9]+]] {14; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr @__msan_param_tls, align 815; CHECK-NEXT:    call void @llvm.donothing()16; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP1]])17; CHECK-NEXT:    [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[A]])18; CHECK-NEXT:    store <2 x i16> [[TMP2]], ptr @__msan_retval_tls, align 819; CHECK-NEXT:    ret <2 x i16> [[B]]20;21  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a)22  ret <2 x i16> %b23}24 25declare i64 @llvm.bitreverse.i64(i64) readnone26 27define i64 @test_bitreverse_i64(i64 %a) nounwind #0 {28; CHECK-LABEL: define i64 @test_bitreverse_i64(29; CHECK-SAME: i64 [[A:%.*]]) #[[ATTR1]] {30; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 831; CHECK-NEXT:    call void @llvm.donothing()32; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.bitreverse.i64(i64 [[TMP1]])33; CHECK-NEXT:    [[B:%.*]] = call i64 @llvm.bitreverse.i64(i64 [[A]])34; CHECK-NEXT:    store i64 [[TMP2]], ptr @__msan_retval_tls, align 835; CHECK-NEXT:    ret i64 [[B]]36;37  %b = call i64 @llvm.bitreverse.i64(i64 %a)38  ret i64 %b39}40 41declare i32 @llvm.bitreverse.i32(i32) readnone42 43define i32 @test_bitreverse_i32(i32 %a) nounwind #0 {44; CHECK-LABEL: define i32 @test_bitreverse_i32(45; CHECK-SAME: i32 [[A:%.*]]) #[[ATTR1]] {46; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 847; CHECK-NEXT:    call void @llvm.donothing()48; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]])49; CHECK-NEXT:    [[B:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[A]])50; CHECK-NEXT:    store i32 [[TMP2]], ptr @__msan_retval_tls, align 851; CHECK-NEXT:    ret i32 [[B]]52;53  %b = call i32 @llvm.bitreverse.i32(i32 %a)54  ret i32 %b55}56 57declare i24 @llvm.bitreverse.i24(i24) readnone58 59define i24 @test_bitreverse_i24(i24 %a) nounwind #0 {60; CHECK-LABEL: define i24 @test_bitreverse_i24(61; CHECK-SAME: i24 [[A:%.*]]) #[[ATTR1]] {62; CHECK-NEXT:    [[TMP1:%.*]] = load i24, ptr @__msan_param_tls, align 863; CHECK-NEXT:    call void @llvm.donothing()64; CHECK-NEXT:    [[TMP2:%.*]] = call i24 @llvm.bitreverse.i24(i24 [[TMP1]])65; CHECK-NEXT:    [[B:%.*]] = call i24 @llvm.bitreverse.i24(i24 [[A]])66; CHECK-NEXT:    store i24 [[TMP2]], ptr @__msan_retval_tls, align 867; CHECK-NEXT:    ret i24 [[B]]68;69  %b = call i24 @llvm.bitreverse.i24(i24 %a)70  ret i24 %b71}72 73declare i16 @llvm.bitreverse.i16(i16) readnone74 75define i16 @test_bitreverse_i16(i16 %a) nounwind #0 {76; CHECK-LABEL: define i16 @test_bitreverse_i16(77; CHECK-SAME: i16 [[A:%.*]]) #[[ATTR1]] {78; CHECK-NEXT:    [[TMP1:%.*]] = load i16, ptr @__msan_param_tls, align 879; CHECK-NEXT:    call void @llvm.donothing()80; CHECK-NEXT:    [[TMP2:%.*]] = call i16 @llvm.bitreverse.i16(i16 [[TMP1]])81; CHECK-NEXT:    [[B:%.*]] = call i16 @llvm.bitreverse.i16(i16 [[A]])82; CHECK-NEXT:    store i16 [[TMP2]], ptr @__msan_retval_tls, align 883; CHECK-NEXT:    ret i16 [[B]]84;85  %b = call i16 @llvm.bitreverse.i16(i16 %a)86  ret i16 %b87}88 89declare i8 @llvm.bitreverse.i8(i8) readnone90 91define i8 @test_bitreverse_i8(i8 %a) #0 {92; CHECK-LABEL: define i8 @test_bitreverse_i8(93; CHECK-SAME: i8 [[A:%.*]]) #[[ATTR2:[0-9]+]] {94; CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 895; CHECK-NEXT:    call void @llvm.donothing()96; CHECK-NEXT:    [[TMP2:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP1]])97; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[A]])98; CHECK-NEXT:    store i8 [[TMP2]], ptr @__msan_retval_tls, align 899; CHECK-NEXT:    ret i8 [[B]]100;101  %b = call i8 @llvm.bitreverse.i8(i8 %a)102  ret i8 %b103}104 105declare i4 @llvm.bitreverse.i4(i4) readnone106 107define i4 @test_bitreverse_i4(i4 %a) #0 {108; CHECK-LABEL: define i4 @test_bitreverse_i4(109; CHECK-SAME: i4 [[A:%.*]]) #[[ATTR2]] {110; CHECK-NEXT:    [[TMP1:%.*]] = load i4, ptr @__msan_param_tls, align 8111; CHECK-NEXT:    call void @llvm.donothing()112; CHECK-NEXT:    [[TMP2:%.*]] = call i4 @llvm.bitreverse.i4(i4 [[TMP1]])113; CHECK-NEXT:    [[B:%.*]] = call i4 @llvm.bitreverse.i4(i4 [[A]])114; CHECK-NEXT:    store i4 [[TMP2]], ptr @__msan_retval_tls, align 8115; CHECK-NEXT:    ret i4 [[B]]116;117  %b = call i4 @llvm.bitreverse.i4(i4 %a)118  ret i4 %b119}120 121; These tests check that bitreverse(constant) calls are folded122 123define <2 x i16> @fold_v2i16() #0 {124; CHECK-LABEL: define <2 x i16> @fold_v2i16(125; CHECK-SAME: ) #[[ATTR2]] {126; CHECK-NEXT:    call void @llvm.donothing()127; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> zeroinitializer)128; CHECK-NEXT:    [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>)129; CHECK-NEXT:    store <2 x i16> [[TMP1]], ptr @__msan_retval_tls, align 8130; CHECK-NEXT:    ret <2 x i16> [[B]]131;132  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>)133  ret <2 x i16> %b134}135 136define i24 @fold_i24() #0 {137; CHECK-LABEL: define i24 @fold_i24(138; CHECK-SAME: ) #[[ATTR2]] {139; CHECK-NEXT:    call void @llvm.donothing()140; CHECK-NEXT:    [[TMP1:%.*]] = call i24 @llvm.bitreverse.i24(i24 0)141; CHECK-NEXT:    [[B:%.*]] = call i24 @llvm.bitreverse.i24(i24 4096)142; CHECK-NEXT:    store i24 [[TMP1]], ptr @__msan_retval_tls, align 8143; CHECK-NEXT:    ret i24 [[B]]144;145  %b = call i24 @llvm.bitreverse.i24(i24 4096)146  ret i24 %b147}148 149define i8 @fold_i8() #0 {150; CHECK-LABEL: define i8 @fold_i8(151; CHECK-SAME: ) #[[ATTR2]] {152; CHECK-NEXT:    call void @llvm.donothing()153; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @llvm.bitreverse.i8(i8 0)154; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 15)155; CHECK-NEXT:    store i8 [[TMP1]], ptr @__msan_retval_tls, align 8156; CHECK-NEXT:    ret i8 [[B]]157;158  %b = call i8 @llvm.bitreverse.i8(i8 15)159  ret i8 %b160}161 162define i4 @fold_i4() #0 {163; CHECK-LABEL: define i4 @fold_i4(164; CHECK-SAME: ) #[[ATTR2]] {165; CHECK-NEXT:    call void @llvm.donothing()166; CHECK-NEXT:    [[TMP1:%.*]] = call i4 @llvm.bitreverse.i4(i4 0)167; CHECK-NEXT:    [[B:%.*]] = call i4 @llvm.bitreverse.i4(i4 -8)168; CHECK-NEXT:    store i4 [[TMP1]], ptr @__msan_retval_tls, align 8169; CHECK-NEXT:    ret i4 [[B]]170;171  %b = call i4 @llvm.bitreverse.i4(i4 8)172  ret i4 %b173}174 175; These tests check that bitreverse(bitreverse()) calls are removed176 177define i8 @identity_i8(i8 %a) #0 {178; CHECK-LABEL: define i8 @identity_i8(179; CHECK-SAME: i8 [[A:%.*]]) #[[ATTR2]] {180; CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8181; CHECK-NEXT:    call void @llvm.donothing()182; CHECK-NEXT:    [[TMP2:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP1]])183; CHECK-NEXT:    [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[A]])184; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP2]])185; CHECK-NEXT:    [[C:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[B]])186; CHECK-NEXT:    store i8 [[TMP3]], ptr @__msan_retval_tls, align 8187; CHECK-NEXT:    ret i8 [[C]]188;189  %b = call i8 @llvm.bitreverse.i8(i8 %a)190  %c = call i8 @llvm.bitreverse.i8(i8 %b)191  ret i8 %c192}193 194define <2 x i16> @identity_v2i16(<2 x i16> %a) #0 {195; CHECK-LABEL: define <2 x i16> @identity_v2i16(196; CHECK-SAME: <2 x i16> [[A:%.*]]) #[[ATTR2]] {197; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i16>, ptr @__msan_param_tls, align 8198; CHECK-NEXT:    call void @llvm.donothing()199; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP1]])200; CHECK-NEXT:    [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[A]])201; CHECK-NEXT:    [[TMP3:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP2]])202; CHECK-NEXT:    [[C:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[B]])203; CHECK-NEXT:    store <2 x i16> [[TMP3]], ptr @__msan_retval_tls, align 8204; CHECK-NEXT:    ret <2 x i16> [[C]]205;206  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a)207  %c = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %b)208  ret <2 x i16> %c209}210 211; Undef tests omitted212 213; Make sure we don't assert during type legalization promoting a large214; bitreverse due to the need for a large shift that won't fit in the i8 returned215; from getShiftAmountTy.216define i528 @large_promotion(i528 %A) nounwind #0 {217; CHECK-LABEL: define i528 @large_promotion(218; CHECK-SAME: i528 [[A:%.*]]) #[[ATTR1]] {219; CHECK-NEXT:    [[TMP1:%.*]] = load i528, ptr @__msan_param_tls, align 8220; CHECK-NEXT:    call void @llvm.donothing()221; CHECK-NEXT:    [[TMP2:%.*]] = call i528 @llvm.bitreverse.i528(i528 [[TMP1]])222; CHECK-NEXT:    [[Z:%.*]] = call i528 @llvm.bitreverse.i528(i528 [[A]])223; CHECK-NEXT:    store i528 [[TMP2]], ptr @__msan_retval_tls, align 8224; CHECK-NEXT:    ret i528 [[Z]]225;226  %Z = call i528 @llvm.bitreverse.i528(i528 %A)227  ret i528 %Z228}229declare i528 @llvm.bitreverse.i528(i528)230 231attributes #0 = { sanitize_memory }232