|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 2 | +; RUN: opt < %s -O3 -S | FileCheck %s |
| 3 | + |
| 4 | +; Compile time conversions of NaNs. |
| 5 | + |
| 6 | +target 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 | +target triple = "i686-apple-darwin8" |
| 8 | + |
| 9 | +%struct..0anon = type { float } |
| 10 | +%struct..1anon = type { double } |
| 11 | + |
| 12 | +@fnan = constant [3 x i32] [ i32 2143831397, i32 2143831396, i32 2143831398 ] |
| 13 | +@dnan = constant [3 x i64] [ i64 9223235251041752696, i64 9223235251041752697, i64 9223235250773317239 ], align 8 |
| 14 | +@fsnan = constant [3 x i32] [ i32 2139637093, i32 2139637092, i32 2139637094 ] |
| 15 | +@dsnan = constant [3 x i64] [ i64 9220983451228067448, i64 9220983451228067449, i64 9220983450959631991 ], align 8 |
| 16 | +@.str = internal constant [10 x i8] c"%08x%08x\0A\00" |
| 17 | +@.str1 = internal constant [6 x i8] c"%08x\0A\00" |
| 18 | + |
| 19 | +@var = external global i32 |
| 20 | + |
| 21 | +define i32 @main() { |
| 22 | +; CHECK-LABEL: @main( |
| 23 | +; CHECK-NEXT: entry: |
| 24 | +; CHECK-NEXT: store volatile i32 2147027116, i32* @var, align 4 |
| 25 | +; CHECK-NEXT: store volatile i32 -1610612736, i32* @var, align 4 |
| 26 | +; CHECK-NEXT: store volatile i32 2147027116, i32* @var, align 4 |
| 27 | +; CHECK-NEXT: store volatile i32 -2147483648, i32* @var, align 4 |
| 28 | +; CHECK-NEXT: store volatile i32 2147027116, i32* @var, align 4 |
| 29 | +; CHECK-NEXT: store volatile i32 -1073741824, i32* @var, align 4 |
| 30 | +; CHECK-NEXT: store volatile i32 2147228864, i32* @var, align 4 |
| 31 | +; CHECK-NEXT: store volatile i32 2147228864, i32* @var, align 4 |
| 32 | +; CHECK-NEXT: store volatile i32 2147228864, i32* @var, align 4 |
| 33 | +; CHECK-NEXT: store volatile i32 2146502828, i32* @var, align 4 |
| 34 | +; CHECK-NEXT: store volatile i32 -1610612736, i32* @var, align 4 |
| 35 | +; CHECK-NEXT: store volatile i32 2146502828, i32* @var, align 4 |
| 36 | +; CHECK-NEXT: store volatile i32 -2147483648, i32* @var, align 4 |
| 37 | +; CHECK-NEXT: store volatile i32 2146502828, i32* @var, align 4 |
| 38 | +; CHECK-NEXT: store volatile i32 -1073741824, i32* @var, align 4 |
| 39 | +; CHECK-NEXT: store volatile i32 2143034560, i32* @var, align 4 |
| 40 | +; CHECK-NEXT: store volatile i32 2143034560, i32* @var, align 4 |
| 41 | +; CHECK-NEXT: store volatile i32 2143034560, i32* @var, align 4 |
| 42 | +; CHECK-NEXT: ret i32 undef |
| 43 | +; |
| 44 | +entry: |
| 45 | + %retval = alloca i32, align 4 |
| 46 | + %i = alloca i32, align 4 |
| 47 | + %uf = alloca %struct..0anon, align 4 |
| 48 | + %ud = alloca %struct..1anon, align 8 |
| 49 | + %"alloca point" = bitcast i32 0 to i32 |
| 50 | + store i32 0, i32* %i, align 4 |
| 51 | + br label %bb23 |
| 52 | + |
| 53 | +bb: ; preds = %bb23 |
| 54 | + %t = load i32, i32* %i, align 4 |
| 55 | + %t1 = getelementptr [3 x i32], [3 x i32]* @fnan, i32 0, i32 %t |
| 56 | + %t2 = load i32, i32* %t1, align 4 |
| 57 | + %t3 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 58 | + %t34 = bitcast float* %t3 to i32* |
| 59 | + store i32 %t2, i32* %t34, align 4 |
| 60 | + %t5 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 61 | + %t6 = load float, float* %t5, align 4 |
| 62 | + %t67 = fpext float %t6 to double |
| 63 | + %t8 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 64 | + store double %t67, double* %t8, align 8 |
| 65 | + %t9 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 66 | + %t910 = bitcast double* %t9 to i64* |
| 67 | + %t11 = load i64, i64* %t910, align 8 |
| 68 | + %t1112 = trunc i64 %t11 to i32 |
| 69 | + %t13 = and i32 %t1112, -1 |
| 70 | + %t14 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 71 | + %t1415 = bitcast double* %t14 to i64* |
| 72 | + %t16 = load i64, i64* %t1415, align 8 |
| 73 | + %.cast = zext i32 32 to i64 |
| 74 | + %t17 = ashr i64 %t16, %.cast |
| 75 | + %t1718 = trunc i64 %t17 to i32 |
| 76 | + %t19 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0 |
| 77 | + store volatile i32 %t1718, i32* @var |
| 78 | + store volatile i32 %t13, i32* @var |
| 79 | + %t21 = load i32, i32* %i, align 4 |
| 80 | + %t22 = add i32 %t21, 1 |
| 81 | + store i32 %t22, i32* %i, align 4 |
| 82 | + br label %bb23 |
| 83 | + |
| 84 | +bb23: ; preds = %bb, %entry |
| 85 | + %t24 = load i32, i32* %i, align 4 |
| 86 | + %t25 = icmp sle i32 %t24, 2 |
| 87 | + %t2526 = zext i1 %t25 to i8 |
| 88 | + %toBool = icmp ne i8 %t2526, 0 |
| 89 | + br i1 %toBool, label %bb, label %bb27 |
| 90 | + |
| 91 | +bb27: ; preds = %bb23 |
| 92 | + store i32 0, i32* %i, align 4 |
| 93 | + br label %bb46 |
| 94 | + |
| 95 | +bb28: ; preds = %bb46 |
| 96 | + %t29 = load i32, i32* %i, align 4 |
| 97 | + %t30 = getelementptr [3 x i64], [3 x i64]* @dnan, i32 0, i32 %t29 |
| 98 | + %t31 = load i64, i64* %t30, align 8 |
| 99 | + %t32 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 100 | + %t3233 = bitcast double* %t32 to i64* |
| 101 | + store i64 %t31, i64* %t3233, align 8 |
| 102 | + %t35 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 103 | + %t36 = load double, double* %t35, align 8 |
| 104 | + %t3637 = fptrunc double %t36 to float |
| 105 | + %t38 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 106 | + store float %t3637, float* %t38, align 4 |
| 107 | + %t39 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 108 | + %t3940 = bitcast float* %t39 to i32* |
| 109 | + %t41 = load i32, i32* %t3940, align 4 |
| 110 | + %t42 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0 |
| 111 | + store volatile i32 %t41, i32* @var |
| 112 | + %t44 = load i32, i32* %i, align 4 |
| 113 | + %t45 = add i32 %t44, 1 |
| 114 | + store i32 %t45, i32* %i, align 4 |
| 115 | + br label %bb46 |
| 116 | + |
| 117 | +bb46: ; preds = %bb28, %bb27 |
| 118 | + %t47 = load i32, i32* %i, align 4 |
| 119 | + %t48 = icmp sle i32 %t47, 2 |
| 120 | + %t4849 = zext i1 %t48 to i8 |
| 121 | + %toBool50 = icmp ne i8 %t4849, 0 |
| 122 | + br i1 %toBool50, label %bb28, label %bb51 |
| 123 | + |
| 124 | +bb51: ; preds = %bb46 |
| 125 | + store i32 0, i32* %i, align 4 |
| 126 | + br label %bb78 |
| 127 | + |
| 128 | +bb52: ; preds = %bb78 |
| 129 | + %t53 = load i32, i32* %i, align 4 |
| 130 | + %t54 = getelementptr [3 x i32], [3 x i32]* @fsnan, i32 0, i32 %t53 |
| 131 | + %t55 = load i32, i32* %t54, align 4 |
| 132 | + %t56 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 133 | + %t5657 = bitcast float* %t56 to i32* |
| 134 | + store i32 %t55, i32* %t5657, align 4 |
| 135 | + %t58 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 136 | + %t59 = load float, float* %t58, align 4 |
| 137 | + %t5960 = fpext float %t59 to double |
| 138 | + %t61 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 139 | + store double %t5960, double* %t61, align 8 |
| 140 | + %t62 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 141 | + %t6263 = bitcast double* %t62 to i64* |
| 142 | + %t64 = load i64, i64* %t6263, align 8 |
| 143 | + %t6465 = trunc i64 %t64 to i32 |
| 144 | + %t66 = and i32 %t6465, -1 |
| 145 | + %t68 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 146 | + %t6869 = bitcast double* %t68 to i64* |
| 147 | + %t70 = load i64, i64* %t6869, align 8 |
| 148 | + %.cast71 = zext i32 32 to i64 |
| 149 | + %t72 = ashr i64 %t70, %.cast71 |
| 150 | + %t7273 = trunc i64 %t72 to i32 |
| 151 | + %t74 = getelementptr [10 x i8], [10 x i8]* @.str, i32 0, i32 0 |
| 152 | + store volatile i32 %t7273, i32* @var |
| 153 | + store volatile i32 %t66, i32* @var |
| 154 | + %t76 = load i32, i32* %i, align 4 |
| 155 | + %t77 = add i32 %t76, 1 |
| 156 | + store i32 %t77, i32* %i, align 4 |
| 157 | + br label %bb78 |
| 158 | + |
| 159 | +bb78: ; preds = %bb52, %bb51 |
| 160 | + %t79 = load i32, i32* %i, align 4 |
| 161 | + %t80 = icmp sle i32 %t79, 2 |
| 162 | + %t8081 = zext i1 %t80 to i8 |
| 163 | + %toBool82 = icmp ne i8 %t8081, 0 |
| 164 | + br i1 %toBool82, label %bb52, label %bb83 |
| 165 | + |
| 166 | +bb83: ; preds = %bb78 |
| 167 | + store i32 0, i32* %i, align 4 |
| 168 | + br label %bb101 |
| 169 | + |
| 170 | +bb84: ; preds = %bb101 |
| 171 | + %t85 = load i32, i32* %i, align 4 |
| 172 | + %t86 = getelementptr [3 x i64], [3 x i64]* @dsnan, i32 0, i32 %t85 |
| 173 | + %t87 = load i64, i64* %t86, align 8 |
| 174 | + %t88 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 175 | + %t8889 = bitcast double* %t88 to i64* |
| 176 | + store i64 %t87, i64* %t8889, align 8 |
| 177 | + %t90 = getelementptr %struct..1anon, %struct..1anon* %ud, i32 0, i32 0 |
| 178 | + %t91 = load double, double* %t90, align 8 |
| 179 | + %t9192 = fptrunc double %t91 to float |
| 180 | + %t93 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 181 | + store float %t9192, float* %t93, align 4 |
| 182 | + %t94 = getelementptr %struct..0anon, %struct..0anon* %uf, i32 0, i32 0 |
| 183 | + %t9495 = bitcast float* %t94 to i32* |
| 184 | + %t96 = load i32, i32* %t9495, align 4 |
| 185 | + %t97 = getelementptr [6 x i8], [6 x i8]* @.str1, i32 0, i32 0 |
| 186 | + store volatile i32 %t96, i32* @var |
| 187 | + %t99 = load i32, i32* %i, align 4 |
| 188 | + %t100 = add i32 %t99, 1 |
| 189 | + store i32 %t100, i32* %i, align 4 |
| 190 | + br label %bb101 |
| 191 | + |
| 192 | +bb101: ; preds = %bb84, %bb83 |
| 193 | + %t102 = load i32, i32* %i, align 4 |
| 194 | + %t103 = icmp sle i32 %t102, 2 |
| 195 | + %t103104 = zext i1 %t103 to i8 |
| 196 | + %toBool105 = icmp ne i8 %t103104, 0 |
| 197 | + br i1 %toBool105, label %bb84, label %bb106 |
| 198 | + |
| 199 | +bb106: ; preds = %bb101 |
| 200 | + br label %return |
| 201 | + |
| 202 | +return: ; preds = %bb106 |
| 203 | + %retval107 = load i32, i32* %retval |
| 204 | + ret i32 %retval107 |
| 205 | +} |
0 commit comments