1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -instcombine -S | grep 0x3FB99999A0000000 | count 2 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -simplifycfg -instcombine -S | grep 0xBFB99999A0000000 | count 2 3*9880d681SAndroid Build Coastguard Worker; check constant folding for 'frem'. PR 3316. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; ModuleID = 'tt.c' 6*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" 7*9880d681SAndroid Build Coastguard Workertarget triple = "i386-apple-darwin9.6" 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine float @test1() nounwind { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %retval = alloca float ; <float*> [#uses=2] 12*9880d681SAndroid Build Coastguard Worker %0 = alloca float ; <float*> [#uses=2] 13*9880d681SAndroid Build Coastguard Worker %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] 14*9880d681SAndroid Build Coastguard Worker %1 = frem double 1.000000e-01, 1.000000e+00 ; <double> [#uses=1] 15*9880d681SAndroid Build Coastguard Worker %2 = fptrunc double %1 to float ; <float> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker store float %2, float* %0, align 4 17*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %0, align 4 ; <float> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker store float %3, float* %retval, align 4 19*9880d681SAndroid Build Coastguard Worker br label %return 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 22*9880d681SAndroid Build Coastguard Worker %retval1 = load float, float* %retval ; <float> [#uses=1] 23*9880d681SAndroid Build Coastguard Worker ret float %retval1 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine float @test2() nounwind { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %retval = alloca float ; <float*> [#uses=2] 29*9880d681SAndroid Build Coastguard Worker %0 = alloca float ; <float*> [#uses=2] 30*9880d681SAndroid Build Coastguard Worker %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] 31*9880d681SAndroid Build Coastguard Worker %1 = frem double -1.000000e-01, 1.000000e+00 ; <double> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker %2 = fptrunc double %1 to float ; <float> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker store float %2, float* %0, align 4 34*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %0, align 4 ; <float> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker store float %3, float* %retval, align 4 36*9880d681SAndroid Build Coastguard Worker br label %return 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 39*9880d681SAndroid Build Coastguard Worker %retval1 = load float, float* %retval ; <float> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker ret float %retval1 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine float @test3() nounwind { 44*9880d681SAndroid Build Coastguard Workerentry: 45*9880d681SAndroid Build Coastguard Worker %retval = alloca float ; <float*> [#uses=2] 46*9880d681SAndroid Build Coastguard Worker %0 = alloca float ; <float*> [#uses=2] 47*9880d681SAndroid Build Coastguard Worker %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] 48*9880d681SAndroid Build Coastguard Worker %1 = frem double 1.000000e-01, -1.000000e+00 ; <double> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %2 = fptrunc double %1 to float ; <float> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker store float %2, float* %0, align 4 51*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %0, align 4 ; <float> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker store float %3, float* %retval, align 4 53*9880d681SAndroid Build Coastguard Worker br label %return 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 56*9880d681SAndroid Build Coastguard Worker %retval1 = load float, float* %retval ; <float> [#uses=1] 57*9880d681SAndroid Build Coastguard Worker ret float %retval1 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine float @test4() nounwind { 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker %retval = alloca float ; <float*> [#uses=2] 63*9880d681SAndroid Build Coastguard Worker %0 = alloca float ; <float*> [#uses=2] 64*9880d681SAndroid Build Coastguard Worker %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] 65*9880d681SAndroid Build Coastguard Worker %1 = frem double -1.000000e-01, -1.000000e+00 ; <double> [#uses=1] 66*9880d681SAndroid Build Coastguard Worker %2 = fptrunc double %1 to float ; <float> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker store float %2, float* %0, align 4 68*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %0, align 4 ; <float> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker store float %3, float* %retval, align 4 70*9880d681SAndroid Build Coastguard Worker br label %return 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 73*9880d681SAndroid Build Coastguard Worker %retval1 = load float, float* %retval ; <float> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker ret float %retval1 75*9880d681SAndroid Build Coastguard Worker} 76