1*b280ee1dSBjorn Pettersson; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 2486ed885SArthur Eubanks; REQUIRES: x86-registered-target 3486ed885SArthur Eubanks 4486ed885SArthur Eubanksdefine i1 @test_sse_cvts_exact() nounwind readnone { 5486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_exact( 6486ed885SArthur Eubanks; CHECK-NOT: call 7486ed885SArthur Eubanks; CHECK: ret i1 true 8486ed885SArthur Eubanksentry: 9486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 10486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 11486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 7.0, double undef>) nounwind 12486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 7.0, double undef>) nounwind 13486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 14486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 15486ed885SArthur Eubanks %cmp02 = icmp eq i32 %sum02, 10 16486ed885SArthur Eubanks %cmp13 = icmp eq i64 %sum13, 10 17486ed885SArthur Eubanks %b = and i1 %cmp02, %cmp13 18486ed885SArthur Eubanks ret i1 %b 19486ed885SArthur Eubanks} 20486ed885SArthur Eubanks 21486ed885SArthur Eubanks; Inexact values should not fold as they are dependent on rounding mode 22486ed885SArthur Eubanksdefine i1 @test_sse_cvts_inexact() nounwind readnone { 23486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_inexact( 24486ed885SArthur Eubanks; CHECK: call 25486ed885SArthur Eubanks; CHECK: call 26486ed885SArthur Eubanks; CHECK: call 27486ed885SArthur Eubanks; CHECK: call 28486ed885SArthur Eubanksentry: 29486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 30486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 31486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> <double 1.75, double undef>) nounwind 32486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> <double 1.75, double undef>) nounwind 33486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 34486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 35486ed885SArthur Eubanks %cmp02 = icmp eq i32 %sum02, 4 36486ed885SArthur Eubanks %cmp13 = icmp eq i64 %sum13, 4 37486ed885SArthur Eubanks %b = and i1 %cmp02, %cmp13 38486ed885SArthur Eubanks ret i1 %b 39486ed885SArthur Eubanks} 40486ed885SArthur Eubanks 41486ed885SArthur Eubanks; FLT_MAX/DBL_MAX should not fold 42486ed885SArthur Eubanksdefine i1 @test_sse_cvts_max() nounwind readnone { 43486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_max( 44486ed885SArthur Eubanks; CHECK: call 45486ed885SArthur Eubanks; CHECK: call 46486ed885SArthur Eubanks; CHECK: call 47486ed885SArthur Eubanks; CHECK: call 48486ed885SArthur Eubanksentry: 49486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float> 50486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double> 51486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 52486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 53486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 54486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 55486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 56486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 57486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 58486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 59486ed885SArthur Eubanks ret i1 %b 60486ed885SArthur Eubanks} 61486ed885SArthur Eubanks 62486ed885SArthur Eubanks; INF should not fold 63486ed885SArthur Eubanksdefine i1 @test_sse_cvts_inf() nounwind readnone { 64486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_inf( 65486ed885SArthur Eubanks; CHECK: call 66486ed885SArthur Eubanks; CHECK: call 67486ed885SArthur Eubanks; CHECK: call 68486ed885SArthur Eubanks; CHECK: call 69486ed885SArthur Eubanksentry: 70486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float> 71486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double> 72486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 73486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 74486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 75486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 76486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 77486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 78486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 79486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 80486ed885SArthur Eubanks ret i1 %b 81486ed885SArthur Eubanks} 82486ed885SArthur Eubanks 83486ed885SArthur Eubanks; NAN should not fold 84486ed885SArthur Eubanksdefine i1 @test_sse_cvts_nan() nounwind readnone { 85486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvts_nan( 86486ed885SArthur Eubanks; CHECK: call 87486ed885SArthur Eubanks; CHECK: call 88486ed885SArthur Eubanks; CHECK: call 89486ed885SArthur Eubanks; CHECK: call 90486ed885SArthur Eubanksentry: 91486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float> 92486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double> 93486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvtss2si(<4 x float> %fm) nounwind 94486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %fm) nounwind 95486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvtsd2si(<2 x double> %dm) nounwind 96486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %dm) nounwind 97486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 98486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 99486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 100486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 101486ed885SArthur Eubanks ret i1 %b 102486ed885SArthur Eubanks} 103486ed885SArthur Eubanks 104486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_exact() nounwind readnone { 105486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_exact( 106486ed885SArthur Eubanks; CHECK-NOT: call 107486ed885SArthur Eubanks; CHECK: ret i1 true 108486ed885SArthur Eubanksentry: 109486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 110486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 3.0, float undef, float undef, float undef>) nounwind 111486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 7.0, double undef>) nounwind 112486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 7.0, double undef>) nounwind 113486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 114486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 115486ed885SArthur Eubanks %cmp02 = icmp eq i32 %sum02, 10 116486ed885SArthur Eubanks %cmp13 = icmp eq i64 %sum13, 10 117486ed885SArthur Eubanks %b = and i1 %cmp02, %cmp13 118486ed885SArthur Eubanks ret i1 %b 119486ed885SArthur Eubanks} 120486ed885SArthur Eubanks 121486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_inexact() nounwind readnone { 122486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_inexact( 123486ed885SArthur Eubanks; CHECK-NOT: call 124486ed885SArthur Eubanks; CHECK: ret i1 true 125486ed885SArthur Eubanksentry: 126486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 127486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> <float 1.75, float undef, float undef, float undef>) nounwind 128486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> <double 1.75, double undef>) nounwind 129486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> <double 1.75, double undef>) nounwind 130486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 131486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 132486ed885SArthur Eubanks %cmp02 = icmp eq i32 %sum02, 2 133486ed885SArthur Eubanks %cmp13 = icmp eq i64 %sum13, 2 134486ed885SArthur Eubanks %b = and i1 %cmp02, %cmp13 135486ed885SArthur Eubanks ret i1 %b 136486ed885SArthur Eubanks} 137486ed885SArthur Eubanks 138486ed885SArthur Eubanks; FLT_MAX/DBL_MAX should not fold 139486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_max() nounwind readnone { 140486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_max( 141486ed885SArthur Eubanks; CHECK: call 142486ed885SArthur Eubanks; CHECK: call 143486ed885SArthur Eubanks; CHECK: call 144486ed885SArthur Eubanks; CHECK: call 145486ed885SArthur Eubanksentry: 146486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2139095039, i32 undef, i32 undef, i32 undef> to <4 x float> 147486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9218868437227405311, i64 undef> to <2 x double> 148486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 149486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 150486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 151486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 152486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 153486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 154486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 155486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 156486ed885SArthur Eubanks ret i1 %b 157486ed885SArthur Eubanks} 158486ed885SArthur Eubanks 159486ed885SArthur Eubanks; INF should not fold 160486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_inf() nounwind readnone { 161486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_inf( 162486ed885SArthur Eubanks; CHECK: call 163486ed885SArthur Eubanks; CHECK: call 164486ed885SArthur Eubanks; CHECK: call 165486ed885SArthur Eubanks; CHECK: call 166486ed885SArthur Eubanksentry: 167486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2139095040, i32 undef, i32 undef, i32 undef> to <4 x float> 168486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9218868437227405312, i64 undef> to <2 x double> 169486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 170486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 171486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 172486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 173486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 174486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 175486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 176486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 177486ed885SArthur Eubanks ret i1 %b 178486ed885SArthur Eubanks} 179486ed885SArthur Eubanks 180486ed885SArthur Eubanks; NAN should not fold 181486ed885SArthur Eubanksdefine i1 @test_sse_cvtts_nan() nounwind readnone { 182486ed885SArthur Eubanks; CHECK-LABEL: @test_sse_cvtts_nan( 183486ed885SArthur Eubanks; CHECK: call 184486ed885SArthur Eubanks; CHECK: call 185486ed885SArthur Eubanks; CHECK: call 186486ed885SArthur Eubanks; CHECK: call 187486ed885SArthur Eubanksentry: 188486ed885SArthur Eubanks %fm = bitcast <4 x i32> <i32 2143289344, i32 undef, i32 undef, i32 undef> to <4 x float> 189486ed885SArthur Eubanks %dm = bitcast <2 x i64> <i64 9221120237041090560, i64 undef> to <2 x double> 190486ed885SArthur Eubanks %i0 = tail call i32 @llvm.x86.sse.cvttss2si(<4 x float> %fm) nounwind 191486ed885SArthur Eubanks %i1 = tail call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %fm) nounwind 192486ed885SArthur Eubanks %i2 = call i32 @llvm.x86.sse2.cvttsd2si(<2 x double> %dm) nounwind 193486ed885SArthur Eubanks %i3 = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %dm) nounwind 194486ed885SArthur Eubanks %sum02 = add i32 %i0, %i2 195486ed885SArthur Eubanks %sum13 = add i64 %i1, %i3 196486ed885SArthur Eubanks %sum02.sext = sext i32 %sum02 to i64 197486ed885SArthur Eubanks %b = icmp eq i64 %sum02.sext, %sum13 198486ed885SArthur Eubanks ret i1 %b 199486ed885SArthur Eubanks} 200486ed885SArthur Eubanks 201486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone 202486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse.cvttss2si(<4 x float>) nounwind readnone 203486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone 204486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone 205486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse2.cvtsd2si(<2 x double>) nounwind readnone 206486ed885SArthur Eubanksdeclare i32 @llvm.x86.sse2.cvttsd2si(<2 x double>) nounwind readnone 207486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone 208486ed885SArthur Eubanksdeclare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone 209