llvmpipe: Optimize away min/max with equal operands.
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 3 Aug 2009 18:31:56 +0000 (19:31 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:22 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld_arit.c

index ba272df296136a92dcf73b23ec1eabc7e3d4989d..db0db02c152a0e7169e36977e65d6ef6ffc4b7e8 100644 (file)
@@ -288,6 +288,14 @@ lp_build_intrinsic_binary(LLVMBuilderRef builder,
    }
    assert(LLVMIsDeclaration(function));
 
+#ifdef DEBUG
+   /* We shouldn't use only constants with intrinsics, as they won't be
+    * propagated by LLVM optimization passes.
+    */
+   if(LLVMIsConstant(a) && LLVMIsConstant(b))
+      debug_printf("warning: invoking intrinsic \"%s\" with constants\n");
+#endif
+
    args[0] = a;
    args[1] = b;
 
@@ -678,6 +686,9 @@ lp_build_min(struct lp_build_context *bld,
    if(a == bld->undef || b == bld->undef)
       return bld->undef;
 
+   if(a == b)
+      return a;
+
    if(bld->type.norm) {
       if(a == bld->zero || b == bld->zero)
          return bld->zero;
@@ -699,6 +710,9 @@ lp_build_max(struct lp_build_context *bld,
    if(a == bld->undef || b == bld->undef)
       return bld->undef;
 
+   if(a == b)
+      return a;
+
    if(bld->type.norm) {
       if(a == bld->one || b == bld->one)
          return bld->one;