brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.1 KiB · 14da03d Raw
263 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s -mtriple=x86_64-apple-macosx10.9 | FileCheck %s --check-prefix=CHECK-FLOAT-IN-VEC3; RUN: opt -passes=instcombine -S < %s -mtriple=arm-apple-ios7.0 | FileCheck %s --check-prefixes=CHECK,CHECK-DOUBLE-ALIGN44; RUN: opt -passes=instcombine -S < %s -mtriple=arm64-apple-ios7.0 | FileCheck %s --check-prefixes=CHECK,CHECK-DOUBLE-ALIGN85; RUN: opt -passes=instcombine -S < %s -mtriple=x86_64-apple-macosx10.8 | FileCheck %s --check-prefixes=CHECK-NO-SINCOS,CHECK-NO-SINCOS-DOUBLE-ALIGN86; RUN: opt -passes=instcombine -S < %s -mtriple=arm-apple-ios6.0 | FileCheck %s --check-prefixes=CHECK-NO-SINCOS,CHECK-NO-SINCOS-DOUBLE-ALIGN47; RUN: opt -passes=instcombine -S < %s -mtriple=x86_64-none-linux-gnu | FileCheck %s --check-prefixes=CHECK-NO-SINCOS,CHECK-NO-SINCOS-DOUBLE-ALIGN88; REQUIRES: arm-registered-target, x86-registered-target9 10attributes #0 = { readnone nounwind }11 12declare float @__sinpif(float %x) #013declare float @__cospif(float %x) #014 15declare double @__sinpi(double %x) #016declare double @__cospi(double %x) #017 18@var32 = global float 0.019@var64 = global double 0.020 21define float @test_instbased_f32() {22; CHECK-FLOAT-IN-VEC-LABEL: @test_instbased_f32(23; CHECK-FLOAT-IN-VEC-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 424; CHECK-FLOAT-IN-VEC-NEXT:    [[SINCOSPI:%.*]] = call <2 x float> @__sincospif_stret(float [[VAL]])25; CHECK-FLOAT-IN-VEC-NEXT:    [[SINPI:%.*]] = extractelement <2 x float> [[SINCOSPI]], i64 026; CHECK-FLOAT-IN-VEC-NEXT:    [[COSPI:%.*]] = extractelement <2 x float> [[SINCOSPI]], i64 127; CHECK-FLOAT-IN-VEC-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0:[0-9]+]]28; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]29; CHECK-FLOAT-IN-VEC-NEXT:    ret float [[RES]]30;31; CHECK-LABEL: @test_instbased_f32(32; CHECK-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 433; CHECK-NEXT:    [[SINCOSPI:%.*]] = call { float, float } @__sincospif_stret(float [[VAL]])34; CHECK-NEXT:    [[SINPI:%.*]] = extractvalue { float, float } [[SINCOSPI]], 035; CHECK-NEXT:    [[COSPI:%.*]] = extractvalue { float, float } [[SINCOSPI]], 136; CHECK-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0:[0-9]+]]37; CHECK-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]38; CHECK-NEXT:    ret float [[RES]]39;40; CHECK-NO-SINCOS-LABEL: @test_instbased_f32(41; CHECK-NO-SINCOS-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 442; CHECK-NO-SINCOS-NEXT:    [[SIN:%.*]] = call float @__sinpif(float [[VAL]]) #[[ATTR0:[0-9]+]]43; CHECK-NO-SINCOS-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0]]44; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = fadd float [[SIN]], [[COS]]45; CHECK-NO-SINCOS-NEXT:    ret float [[RES]]46;47  %val = load float, ptr @var3248  %sin = call float @__sinpif(float %val) #049  %cos = call float @__cospif(float %val) #050  %res = fadd float %sin, %cos51  ret float %res52}53 54define float @test_instbased_f32_other_user(ptr %ptr) {55; CHECK-FLOAT-IN-VEC-LABEL: @test_instbased_f32_other_user(56; CHECK-FLOAT-IN-VEC-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 457; CHECK-FLOAT-IN-VEC-NEXT:    [[SINCOSPI:%.*]] = call <2 x float> @__sincospif_stret(float [[VAL]])58; CHECK-FLOAT-IN-VEC-NEXT:    [[SINPI:%.*]] = extractelement <2 x float> [[SINCOSPI]], i64 059; CHECK-FLOAT-IN-VEC-NEXT:    [[COSPI:%.*]] = extractelement <2 x float> [[SINCOSPI]], i64 160; CHECK-FLOAT-IN-VEC-NEXT:    store float [[VAL]], ptr [[PTR:%.*]], align 461; CHECK-FLOAT-IN-VEC-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0]]62; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]63; CHECK-FLOAT-IN-VEC-NEXT:    ret float [[RES]]64;65; CHECK-LABEL: @test_instbased_f32_other_user(66; CHECK-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 467; CHECK-NEXT:    [[SINCOSPI:%.*]] = call { float, float } @__sincospif_stret(float [[VAL]])68; CHECK-NEXT:    [[SINPI:%.*]] = extractvalue { float, float } [[SINCOSPI]], 069; CHECK-NEXT:    [[COSPI:%.*]] = extractvalue { float, float } [[SINCOSPI]], 170; CHECK-NEXT:    store float [[VAL]], ptr [[PTR:%.*]], align 471; CHECK-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0]]72; CHECK-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]73; CHECK-NEXT:    ret float [[RES]]74;75; CHECK-NO-SINCOS-LABEL: @test_instbased_f32_other_user(76; CHECK-NO-SINCOS-NEXT:    [[VAL:%.*]] = load float, ptr @var32, align 477; CHECK-NO-SINCOS-NEXT:    store float [[VAL]], ptr [[PTR:%.*]], align 478; CHECK-NO-SINCOS-NEXT:    [[SIN:%.*]] = call float @__sinpif(float [[VAL]]) #[[ATTR0]]79; CHECK-NO-SINCOS-NEXT:    [[COS:%.*]] = call float @__cospif(float [[VAL]]) #[[ATTR0]]80; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = fadd float [[SIN]], [[COS]]81; CHECK-NO-SINCOS-NEXT:    ret float [[RES]]82;83  %val = load float, ptr @var3284  store float %val, ptr %ptr85  %sin = call float @__sinpif(float %val) #086  %cos = call float @__cospif(float %val) #087  %res = fadd float %sin, %cos88  ret float %res89}90 91define float @test_constant_f32() {92; CHECK-FLOAT-IN-VEC-LABEL: @test_constant_f32(93; CHECK-FLOAT-IN-VEC-NEXT:    [[SINPI:%.*]] = call float @__sinpif(float 1.000000e+00) #[[ATTR0]]94; CHECK-FLOAT-IN-VEC-NEXT:    [[COSPI:%.*]] = call float @__cospif(float 1.000000e+00) #[[ATTR0]]95; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]96; CHECK-FLOAT-IN-VEC-NEXT:    ret float [[RES]]97;98; CHECK-LABEL: @test_constant_f32(99; CHECK-NEXT:    [[SINPI:%.*]] = call float @__sinpif(float 1.000000e+00) #[[ATTR0]]100; CHECK-NEXT:    [[COSPI:%.*]] = call float @__cospif(float 1.000000e+00) #[[ATTR0]]101; CHECK-NEXT:    [[RES:%.*]] = fadd float [[SINPI]], [[COSPI]]102; CHECK-NEXT:    ret float [[RES]]103;104; CHECK-NO-SINCOS-LABEL: @test_constant_f32(105; CHECK-NO-SINCOS-NEXT:    [[SIN:%.*]] = call float @__sinpif(float 1.000000e+00) #[[ATTR0]]106; CHECK-NO-SINCOS-NEXT:    [[COS:%.*]] = call float @__cospif(float 1.000000e+00) #[[ATTR0]]107; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = fadd float [[SIN]], [[COS]]108; CHECK-NO-SINCOS-NEXT:    ret float [[RES]]109;110  %sin = call float @__sinpif(float 1.0) #0111  %cos = call float @__cospif(float 1.0) #0112  %res = fadd float %sin, %cos113  ret float %res114 115 116}117 118define double @test_instbased_f64() {119; CHECK-FLOAT-IN-VEC-LABEL: @test_instbased_f64(120; CHECK-FLOAT-IN-VEC-NEXT:    [[VAL:%.*]] = load double, ptr @var64, align 8121; CHECK-FLOAT-IN-VEC-NEXT:    [[SINCOSPI:%.*]] = call { double, double } @__sincospi_stret(double [[VAL]])122; CHECK-FLOAT-IN-VEC-NEXT:    [[SINPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 0123; CHECK-FLOAT-IN-VEC-NEXT:    [[COSPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 1124; CHECK-FLOAT-IN-VEC-NEXT:    [[COS:%.*]] = call double @__cospi(double [[VAL]]) #[[ATTR0]]125; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd double [[SINPI]], [[COSPI]]126; CHECK-FLOAT-IN-VEC-NEXT:    ret double [[RES]]127;128; CHECK-DOUBLE-ALIGN4-LABEL: @test_instbased_f64(129; CHECK-DOUBLE-ALIGN4-NEXT:    [[VAL:%.*]] = load double, ptr @var64, align 4130; CHECK-DOUBLE-ALIGN4-NEXT:    [[SINCOSPI:%.*]] = call { double, double } @__sincospi_stret(double [[VAL]])131; CHECK-DOUBLE-ALIGN4-NEXT:    [[SINPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 0132; CHECK-DOUBLE-ALIGN4-NEXT:    [[COSPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 1133; CHECK-DOUBLE-ALIGN4-NEXT:    [[COS:%.*]] = call double @__cospi(double [[VAL]]) #[[ATTR0]]134; CHECK-DOUBLE-ALIGN4-NEXT:    [[RES:%.*]] = fadd double [[SINPI]], [[COSPI]]135; CHECK-DOUBLE-ALIGN4-NEXT:    ret double [[RES]]136;137; CHECK-DOUBLE-ALIGN8-LABEL: @test_instbased_f64(138; CHECK-DOUBLE-ALIGN8-NEXT:    [[VAL:%.*]] = load double, ptr @var64, align 8139; CHECK-DOUBLE-ALIGN8-NEXT:    [[SINCOSPI:%.*]] = call { double, double } @__sincospi_stret(double [[VAL]])140; CHECK-DOUBLE-ALIGN8-NEXT:    [[SINPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 0141; CHECK-DOUBLE-ALIGN8-NEXT:    [[COSPI:%.*]] = extractvalue { double, double } [[SINCOSPI]], 1142; CHECK-DOUBLE-ALIGN8-NEXT:    [[COS:%.*]] = call double @__cospi(double [[VAL]]) #[[ATTR0]]143; CHECK-DOUBLE-ALIGN8-NEXT:    [[RES:%.*]] = fadd double [[SINPI]], [[COSPI]]144; CHECK-DOUBLE-ALIGN8-NEXT:    ret double [[RES]]145;146; CHECK-NO-SINCOS-DOUBLE-ALIGN8-LABEL: @test_instbased_f64(147; CHECK-NO-SINCOS-DOUBLE-ALIGN8-NEXT:    [[VAL:%.*]] = load double, ptr @var64, align 8148; CHECK-NO-SINCOS-DOUBLE-ALIGN8-NEXT:    [[SIN:%.*]] = call double @__sinpi(double [[VAL]]) #[[ATTR0]]149; CHECK-NO-SINCOS-DOUBLE-ALIGN8-NEXT:    [[COS:%.*]] = call double @__cospi(double [[VAL]]) #[[ATTR0]]150; CHECK-NO-SINCOS-DOUBLE-ALIGN8-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]151; CHECK-NO-SINCOS-DOUBLE-ALIGN8-NEXT:    ret double [[RES]]152;153; CHECK-NO-SINCOS-DOUBLE-ALIGN4-LABEL: @test_instbased_f64(154; CHECK-NO-SINCOS-DOUBLE-ALIGN4-NEXT:    [[VAL:%.*]] = load double, ptr @var64, align 4155; CHECK-NO-SINCOS-DOUBLE-ALIGN4-NEXT:    [[SIN:%.*]] = call double @__sinpi(double [[VAL]]) #[[ATTR0]]156; CHECK-NO-SINCOS-DOUBLE-ALIGN4-NEXT:    [[COS:%.*]] = call double @__cospi(double [[VAL]]) #[[ATTR0]]157; CHECK-NO-SINCOS-DOUBLE-ALIGN4-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]158; CHECK-NO-SINCOS-DOUBLE-ALIGN4-NEXT:    ret double [[RES]]159;160  %val = load double, ptr @var64161  %sin = call double @__sinpi(double %val) #0162  %cos = call double @__cospi(double %val) #0163  %res = fadd double %sin, %cos164  ret double %res165 166 167}168 169define double @test_constant_f64() {170; CHECK-FLOAT-IN-VEC-LABEL: @test_constant_f64(171; CHECK-FLOAT-IN-VEC-NEXT:    [[SINPI:%.*]] = call double @__sinpi(double 1.000000e+00) #[[ATTR0]]172; CHECK-FLOAT-IN-VEC-NEXT:    [[COSPI:%.*]] = call double @__cospi(double 1.000000e+00) #[[ATTR0]]173; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd double [[SINPI]], [[COSPI]]174; CHECK-FLOAT-IN-VEC-NEXT:    ret double [[RES]]175;176; CHECK-LABEL: @test_constant_f64(177; CHECK-NEXT:    [[SINPI:%.*]] = call double @__sinpi(double 1.000000e+00) #[[ATTR0]]178; CHECK-NEXT:    [[COSPI:%.*]] = call double @__cospi(double 1.000000e+00) #[[ATTR0]]179; CHECK-NEXT:    [[RES:%.*]] = fadd double [[SINPI]], [[COSPI]]180; CHECK-NEXT:    ret double [[RES]]181;182; CHECK-NO-SINCOS-LABEL: @test_constant_f64(183; CHECK-NO-SINCOS-NEXT:    [[SIN:%.*]] = call double @__sinpi(double 1.000000e+00) #[[ATTR0]]184; CHECK-NO-SINCOS-NEXT:    [[COS:%.*]] = call double @__cospi(double 1.000000e+00) #[[ATTR0]]185; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]186; CHECK-NO-SINCOS-NEXT:    ret double [[RES]]187;188  %sin = call double @__sinpi(double 1.0) #0189  %cos = call double @__cospi(double 1.0) #0190  %res = fadd double %sin, %cos191  ret double %res192 193 194}195 196define double @test_fptr(ptr %fptr, double %p1) {197; CHECK-FLOAT-IN-VEC-LABEL: @test_fptr(198; CHECK-FLOAT-IN-VEC-NEXT:    [[SIN:%.*]] = call double @__sinpi(double [[P1:%.*]]) #[[ATTR0]]199; CHECK-FLOAT-IN-VEC-NEXT:    [[COS:%.*]] = call double [[FPTR:%.*]](double [[P1]])200; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]201; CHECK-FLOAT-IN-VEC-NEXT:    ret double [[RES]]202;203; CHECK-LABEL: @test_fptr(204; CHECK-NEXT:    [[SIN:%.*]] = call double @__sinpi(double [[P1:%.*]]) #[[ATTR0]]205; CHECK-NEXT:    [[COS:%.*]] = call double [[FPTR:%.*]](double [[P1]])206; CHECK-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]207; CHECK-NEXT:    ret double [[RES]]208;209; CHECK-NO-SINCOS-LABEL: @test_fptr(210; CHECK-NO-SINCOS-NEXT:    [[SIN:%.*]] = call double @__sinpi(double [[P1:%.*]]) #[[ATTR0]]211; CHECK-NO-SINCOS-NEXT:    [[COS:%.*]] = call double [[FPTR:%.*]](double [[P1]])212; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = fadd double [[SIN]], [[COS]]213; CHECK-NO-SINCOS-NEXT:    ret double [[RES]]214;215  %sin = call double @__sinpi(double %p1) #0216  %cos = call double %fptr(double %p1)217  %res = fadd double %sin, %cos218  ret double %res219}220 221define i1 @test_cospif_used_in_branch_cond() {222; CHECK-FLOAT-IN-VEC-LABEL: @test_cospif_used_in_branch_cond(223; CHECK-FLOAT-IN-VEC-NEXT:  entry:224; CHECK-FLOAT-IN-VEC-NEXT:    [[RES:%.*]] = call float @__cospif(float noundef 0.000000e+00)225; CHECK-FLOAT-IN-VEC-NEXT:    [[CMP:%.*]] = fcmp uno float [[RES]], 0.000000e+00226; CHECK-FLOAT-IN-VEC-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]227; CHECK-FLOAT-IN-VEC:       then:228; CHECK-FLOAT-IN-VEC-NEXT:    ret i1 false229; CHECK-FLOAT-IN-VEC:       else:230; CHECK-FLOAT-IN-VEC-NEXT:    ret i1 true231;232; CHECK-LABEL: @test_cospif_used_in_branch_cond(233; CHECK-NEXT:  entry:234; CHECK-NEXT:    [[RES:%.*]] = call float @__cospif(float noundef 0.000000e+00)235; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[RES]], 0.000000e+00236; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]237; CHECK:       then:238; CHECK-NEXT:    ret i1 false239; CHECK:       else:240; CHECK-NEXT:    ret i1 true241;242; CHECK-NO-SINCOS-LABEL: @test_cospif_used_in_branch_cond(243; CHECK-NO-SINCOS-NEXT:  entry:244; CHECK-NO-SINCOS-NEXT:    [[RES:%.*]] = call float @__cospif(float noundef 0.000000e+00)245; CHECK-NO-SINCOS-NEXT:    [[CMP:%.*]] = fcmp uno float [[RES]], 0.000000e+00246; CHECK-NO-SINCOS-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]247; CHECK-NO-SINCOS:       then:248; CHECK-NO-SINCOS-NEXT:    ret i1 false249; CHECK-NO-SINCOS:       else:250; CHECK-NO-SINCOS-NEXT:    ret i1 true251;252entry:253  %res = call float @__cospif(float noundef 0.000000e+00) #3254  %cmp = fcmp uno float %res, 0.000000e+00255  br i1 %cmp, label %then, label %else256 257then:258  ret i1 false259 260else:261  ret i1 true262}263