brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.5 KiB · 39e62bc Raw
382 lines · c
1// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNPADDED2// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,PADDED3 4// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,UNPADDED5// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,PADDED6 7// Fixed point against other fixed point8_Bool b_eq_true = 2.5hk == 2.5uhk;  // CHECK-DAG: @b_eq_true  = {{.*}}global i8 1, align 19_Bool b_eq_false = 2.5hk == 2.4uhk; // CHECK-DAG: @b_eq_false = {{.*}}global i8 0, align 110 11_Bool b_ne_true = 2.5hk != 2.4uhk;  // CHECK-DAG: @b_ne_true  = {{.*}}global i8 1, align 112_Bool b_ne_false = 2.5hk != 2.5uhk; // CHECK-DAG: @b_ne_false = {{.*}}global i8 0, align 113 14_Bool b_lt_true = 2.5hk < 2.75uhk; // CHECK-DAG: @b_lt_true  = {{.*}}global i8 1, align 115_Bool b_lt_false = 2.5hk < 2.5uhk; // CHECK-DAG: @b_lt_false = {{.*}}global i8 0, align 116 17_Bool b_le_true = 2.5hk <= 2.75uhk; // CHECK-DAG: @b_le_true  = {{.*}}global i8 1, align 118_Bool b_le_true2 = 2.5hk <= 2.5uhk; // CHECK-DAG: @b_le_true2 = {{.*}}global i8 1, align 119_Bool b_le_false = 2.5hk <= 2.4uhk; // CHECK-DAG: @b_le_false = {{.*}}global i8 0, align 120 21_Bool b_gt_true = 2.75hk > 2.5uhk;   // CHECK-DAG: @b_gt_true  = {{.*}}global i8 1, align 122_Bool b_gt_false = 2.75hk > 2.75uhk; // CHECK-DAG: @b_gt_false = {{.*}}global i8 0, align 123 24_Bool b_ge_true = 2.75hk >= 2.5uhk;   // CHECK-DAG: @b_ge_true  = {{.*}}global i8 1, align 125_Bool b_ge_true2 = 2.75hk >= 2.75uhk; // CHECK-DAG: @b_ge_true2 = {{.*}}global i8 1, align 126_Bool b_ge_false = 2.5hk >= 2.75uhk;  // CHECK-DAG: @b_ge_false = {{.*}}global i8 0, align 127 28// Fixed point against int29_Bool b_ieq_true = 2.0hk == 2;  // CHECK-DAG: @b_ieq_true  = {{.*}}global i8 1, align 130_Bool b_ieq_false = 2.0hk == 3; // CHECK-DAG: @b_ieq_false = {{.*}}global i8 0, align 131 32_Bool b_ine_true = 2.0hk != 3;  // CHECK-DAG: @b_ine_true  = {{.*}}global i8 1, align 133_Bool b_ine_false = 2.0hk != 2; // CHECK-DAG: @b_ine_false = {{.*}}global i8 0, align 134 35_Bool b_ilt_true = 2.0hk < 3;  // CHECK-DAG: @b_ilt_true  = {{.*}}global i8 1, align 136_Bool b_ilt_false = 2.0hk < 2; // CHECK-DAG: @b_ilt_false = {{.*}}global i8 0, align 137 38_Bool b_ile_true = 2.0hk <= 3;  // CHECK-DAG: @b_ile_true  = {{.*}}global i8 1, align 139_Bool b_ile_true2 = 2.0hk <= 2; // CHECK-DAG: @b_ile_true2 = {{.*}}global i8 1, align 140_Bool b_ile_false = 2.0hk <= 1; // CHECK-DAG: @b_ile_false = {{.*}}global i8 0, align 141 42_Bool b_igt_true = 2.0hk > 1;  // CHECK-DAG: @b_igt_true  = {{.*}}global i8 1, align 143_Bool b_igt_false = 2.0hk > 2; // CHECK-DAG: @b_igt_false = {{.*}}global i8 0, align 144 45_Bool b_ige_true = 2.0hk >= 1;  // CHECK-DAG: @b_ige_true  = {{.*}}global i8 1, align 146_Bool b_ige_true2 = 2.0hk >= 2; // CHECK-DAG: @b_ige_true2 = {{.*}}global i8 1, align 147_Bool b_ige_false = 2.0hk >= 3; // CHECK-DAG: @b_ige_false = {{.*}}global i8 0, align 148 49// Different signage50// Since we can have different precisions, non powers of 2 fractions may have51// different actual values when being compared.52_Bool b_sne_true = 2.6hk != 2.6uhk;53// UNPADDED-DAG:   @b_sne_true = {{.*}}global i8 1, align 154// PADDED-DAG: @b_sne_true = {{.*}}global i8 0, align 155 56_Bool b_seq_true = 2.0hk == 2u;  // CHECK-DAG: @b_seq_true  = {{.*}}global i8 1, align 157_Bool b_seq_true2 = 2.0uhk == 2; // CHECK-DAG: @b_seq_true2 = {{.*}}global i8 1, align 158 59void TestComparisons(void) {60  short _Accum sa;61  _Accum a;62  unsigned short _Accum usa;63  unsigned _Accum ua;64 65  // Each of these should be a fixed point conversion followed by the actual66  // comparison operation.67  sa == a;68  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 269  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 470  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3271  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 872  // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]73 74  sa != a;75  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 276  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 477  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3278  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 879  // CHECK-NEXT: {{.*}} = icmp ne i32 [[UPSCALE_A]], [[A2]]80 81  sa > a;82  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 283  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 484  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3285  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 886  // CHECK-NEXT: {{.*}} = icmp sgt i32 [[UPSCALE_A]], [[A2]]87 88  sa >= a;89  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 290  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 491  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3292  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 893  // CHECK-NEXT: {{.*}} = icmp sge i32 [[UPSCALE_A]], [[A2]]94 95  sa < a;96  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 297  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 498  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i3299  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8100  // CHECK-NEXT: {{.*}} = icmp slt i32 [[UPSCALE_A]], [[A2]]101 102  sa <= a;103  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2104  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4105  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32106  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8107  // CHECK-NEXT: {{.*}} = icmp sle i32 [[UPSCALE_A]], [[A2]]108 109  usa > ua;110  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2111  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4112  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32113  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8114  // CHECK-NEXT: {{.*}} = icmp ugt i32 [[UPSCALE_A]], [[A2]]115 116  usa >= ua;117  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2118  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4119  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32120  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8121  // CHECK-NEXT: {{.*}} = icmp uge i32 [[UPSCALE_A]], [[A2]]122 123  usa < ua;124  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2125  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4126  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32127  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8128  // CHECK-NEXT: {{.*}} = icmp ult i32 [[UPSCALE_A]], [[A2]]129 130  usa <= ua;131  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2132  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %ua, align 4133  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i32134  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8135  // CHECK-NEXT: {{.*}} = icmp ule i32 [[UPSCALE_A]], [[A2]]136}137 138void TestIntComparisons(void) {139  short _Accum sa;140  unsigned short _Accum usa;141 142  int i;143  unsigned int ui;144  _Bool b;145  char c;146  short s;147  enum E {148    A = 2149  } e;150 151  // These comparisons shouldn't be that different from comparing against fixed152  // point types with other fixed point types.153  sa == i;154  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2155  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4156  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39157  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39158  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7159  // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]160 161  sa != i;162  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2163  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4164  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39165  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39166  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7167  // CHECK-NEXT: {{.*}} = icmp ne i39 [[RESIZE_A]], [[UPSCALE_I]]168 169  sa > i;170  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2171  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4172  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39173  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39174  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7175  // CHECK-NEXT: {{.*}} = icmp sgt i39 [[RESIZE_A]], [[UPSCALE_I]]176 177  sa >= i;178  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2179  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4180  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39181  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39182  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7183  // CHECK-NEXT: {{.*}} = icmp sge i39 [[RESIZE_A]], [[UPSCALE_I]]184 185  sa < i;186  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2187  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4188  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39189  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39190  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7191  // CHECK-NEXT: {{.*}} = icmp slt i39 [[RESIZE_A]], [[UPSCALE_I]]192 193  sa <= i;194  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2195  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4196  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39197  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39198  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7199  // CHECK-NEXT: {{.*}} = icmp sle i39 [[RESIZE_A]], [[UPSCALE_I]]200 201  usa > ui;202  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2203  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4204  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40205  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40206  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8207  // UNPADDED-NEXT: {{.*}} = icmp ugt i40 [[RESIZE_A]], [[UPSCALE_I]]208  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39209  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39210  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7211  // PADDED-NEXT: {{.*}} = icmp ugt i39 [[RESIZE_A]], [[UPSCALE_I]]212 213  usa >= ui;214  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2215  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4216  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40217  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40218  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8219  // UNPADDED-NEXT: {{.*}} = icmp uge i40 [[RESIZE_A]], [[UPSCALE_I]]220  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39221  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39222  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7223  // PADDED-NEXT: {{.*}} = icmp uge i39 [[RESIZE_A]], [[UPSCALE_I]]224 225  usa < ui;226  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2227  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4228  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40229  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40230  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8231  // UNPADDED-NEXT: {{.*}} = icmp ult i40 [[RESIZE_A]], [[UPSCALE_I]]232  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39233  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39234  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7235  // PADDED-NEXT: {{.*}} = icmp ult i39 [[RESIZE_A]], [[UPSCALE_I]]236 237  usa <= ui;238  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2239  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4240  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40241  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40242  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8243  // UNPADDED-NEXT: {{.*}} = icmp ule i40 [[RESIZE_A]], [[UPSCALE_I]]244  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39245  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39246  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7247  // PADDED-NEXT: {{.*}} = icmp ule i39 [[RESIZE_A]], [[UPSCALE_I]]248 249  // Allow for comparisons with other int like types. These are no different250  // from comparing to an int other than varying sizes. The integer types are251  // still converted to ints or unsigned ints from UsualUnaryConversions().252  sa == b;253  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2254  // CHECK-NEXT: [[B:%[0-9]+]] = load i8, ptr %b, align 1255  // CHECK-NEXT: %loadedv = trunc i8 [[B]] to i1256  // CHECK-NEXT: [[CONV_B:%[a-z0-9]+]] = zext i1 %loadedv to i32257  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39258  // CHECK-NEXT: [[RESIZE_B:%[a-z0-9]+]] = sext i32 [[CONV_B]] to i39259  // CHECK-NEXT: [[UPSCALE_B:%[a-z0-9]+]] = shl i39 [[RESIZE_B]], 7260  // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_B]]261 262  sa == c;263  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2264  // CHECK-NEXT: [[C:%[0-9]+]] = load i8, ptr %c, align 1265  // CHECK-NEXT: [[CONV_C:%[a-z0-9]+]] = sext i8 [[C]] to i32266  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39267  // CHECK-NEXT: [[RESIZE_C:%[a-z0-9]+]] = sext i32 [[CONV_C]] to i39268  // CHECK-NEXT: [[UPSCALE_C:%[a-z0-9]+]] = shl i39 [[RESIZE_C]], 7269  // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_C]]270 271  sa == s;272  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2273  // CHECK-NEXT: [[S:%[0-9]+]] = load i16, ptr %s, align 2274  // CHECK-NEXT: [[CONV_S:%[a-z0-9]+]] = sext i16 [[S]] to i32275  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i39276  // CHECK-NEXT: [[RESIZE_S:%[a-z0-9]+]] = sext i32 [[CONV_S]] to i39277  // CHECK-NEXT: [[UPSCALE_S:%[a-z0-9]+]] = shl i39 [[RESIZE_S]], 7278  // CHECK-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_S]]279 280  // An enum value is IntegralCast to an unsigned int.281  usa == e;282  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2283  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %e, align 4284  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40285  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40286  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8287  // UNPADDED-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]288  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39289  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i39290  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7291  // PADDED-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]292}293 294void TestComparisonSignage(void) {295  short _Accum sa;296  unsigned short _Accum usa;297  int i;298  unsigned int ui;299 300  // Signed vs unsigned fixed point comparison301  sa == usa;302  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2303  // CHECK-NEXT: [[A2:%[0-9]+]] = load i16, ptr %usa, align 2304  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i17305  // UNPADDED-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i17 [[RESIZE_A]], 1306  // UNPADDED-NEXT: [[RESIZE_A2:%[a-z0-9]+]] = zext i16 [[A2]] to i17307  // UNPADDED-NEXT: {{.*}} = icmp eq i17 [[UPSCALE_A]], [[RESIZE_A2]]308  // PADDED-NEXT: {{.*}} = icmp eq i16 [[A]], [[A2]]309 310  // Signed int vs unsigned fixed point311  sa == ui;312  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2313  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %ui, align 4314  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i40315  // CHECK-NEXT: [[RESIZE_I:%[a-z0-9]+]] = zext i32 [[I]] to i40316  // CHECK-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 7317  // CHECK-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]318 319  // Signed fixed point vs unsigned int320  usa == i;321  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %usa, align 2322  // CHECK-NEXT: [[I:%[0-9]+]] = load i32, ptr %i, align 4323  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i40324  // UNPADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i40325  // UNPADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i40 [[RESIZE_I]], 8326  // UNPADDED-NEXT: {{.*}} = icmp eq i40 [[RESIZE_A]], [[UPSCALE_I]]327  // PADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = zext i16 [[A]] to i39328  // PADDED-NEXT: [[RESIZE_I:%[a-z0-9]+]] = sext i32 [[I]] to i39329  // PADDED-NEXT: [[UPSCALE_I:%[a-z0-9]+]] = shl i39 [[RESIZE_I]], 7330  // PADDED-NEXT: {{.*}} = icmp eq i39 [[RESIZE_A]], [[UPSCALE_I]]331}332 333void TestSaturationComparisons(void) {334  short _Accum sa;335  _Accum a;336  _Sat short _Accum sat_sa;337  _Sat _Accum sat_a;338  _Sat unsigned short _Accum sat_usa;339 340  // These are effectively the same as conversions with their non-saturating341  // counterparts since when comparing, we convert both operands to a common342  // type that should be able to hold both values.343  sat_sa == sat_a;344  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2345  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %sat_a, align 4346  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32347  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8348  // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]349 350  sat_sa == a;351  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2352  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4353  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32354  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8355  // CHECK-NEXT: {{.*}} = icmp eq i32 [[UPSCALE_A]], [[A2]]356 357  sat_sa == sat_usa;358  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sat_sa, align 2359  // CHECK-NEXT: [[A2:%[0-9]+]] = load i16, ptr %sat_usa, align 2360  // UNPADDED-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i17361  // UNPADDED-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i17 [[RESIZE_A]], 1362  // UNPADDED-NEXT: [[RESIZE_A2:%[a-z0-9]+]] = zext i16 [[A2]] to i17363  // UNPADDED-NEXT: {{.*}} = icmp eq i17 [[UPSCALE_A]], [[RESIZE_A2]]364  // PADDED-NEXT: {{.*}} = icmp eq i16 [[A]], [[A2]]365}366 367void StoreBooleanResult(void) {368  short _Accum sa;369  _Accum a;370  int res;371 372  // Check that the result can properly be stored as an int.373  res = sa == a;374  // CHECK:      [[A:%[0-9]+]] = load i16, ptr %sa, align 2375  // CHECK-NEXT: [[A2:%[0-9]+]] = load i32, ptr %a, align 4376  // CHECK-NEXT: [[RESIZE_A:%[a-z0-9]+]] = sext i16 [[A]] to i32377  // CHECK-NEXT: [[UPSCALE_A:%[a-z0-9]+]] = shl i32 [[RESIZE_A]], 8378  // CHECK-NEXT: [[RES:%[0-9]+]] = icmp eq i32 [[UPSCALE_A]], [[A2]]379  // CHECK-NEXT: %conv = zext i1 [[RES]] to i32380  // CHECK-NEXT: store i32 %conv, ptr %res, align 4381}382