From 2e78780ea5ac49adee6d9a274655c21188f4ff53 Mon Sep 17 00:00:00 2001
From: Even Rouault <[EMAIL REDACTED]>
Date: Wed, 22 Jun 2022 03:08:14 +0200
Subject: [PATCH] tif_predict.c: make horAcc8() work with icc (ICC) 2021.6.0
20220226 -O2
For a reason I don't understand, recent ICC generates wrong code in -O2
mode for the stride = 3 and 4 cases. The modified code is more
straightfoward, so go for it.
---
libtiff/tif_predict.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/libtiff/tif_predict.c b/libtiff/tif_predict.c
index ffe7133c..cad428cb 100644
--- a/libtiff/tif_predict.c
+++ b/libtiff/tif_predict.c
@@ -310,29 +310,23 @@ horAcc8(TIFF* tif, uint8_t* cp0, tmsize_t cc)
unsigned int cr = cp[0];
unsigned int cg = cp[1];
unsigned int cb = cp[2];
- cc -= 3;
- cp += 3;
- while (cc>0) {
- cp[0] = (unsigned char) ((cr += cp[0]) & 0xff);
- cp[1] = (unsigned char) ((cg += cp[1]) & 0xff);
- cp[2] = (unsigned char) ((cb += cp[2]) & 0xff);
- cc -= 3;
- cp += 3;
+ tmsize_t i = stride;
+ for ( ; i < cc; i += stride) {
+ cp[i+0] = (unsigned char) ((cr += cp[i+0]) & 0xff);
+ cp[i+1] = (unsigned char) ((cg += cp[i+1]) & 0xff);
+ cp[i+2] = (unsigned char) ((cb += cp[i+2]) & 0xff);
}
} else if (stride == 4) {
unsigned int cr = cp[0];
unsigned int cg = cp[1];
unsigned int cb = cp[2];
unsigned int ca = cp[3];
- cc -= 4;
- cp += 4;
- while (cc>0) {
- cp[0] = (unsigned char) ((cr += cp[0]) & 0xff);
- cp[1] = (unsigned char) ((cg += cp[1]) & 0xff);
- cp[2] = (unsigned char) ((cb += cp[2]) & 0xff);
- cp[3] = (unsigned char) ((ca += cp[3]) & 0xff);
- cc -= 4;
- cp += 4;
+ tmsize_t i = stride;
+ for ( ; i < cc; i += stride) {
+ cp[i+0] = (unsigned char) ((cr += cp[i+0]) & 0xff);
+ cp[i+1] = (unsigned char) ((cg += cp[i+1]) & 0xff);
+ cp[i+2] = (unsigned char) ((cb += cp[i+2]) & 0xff);
+ cp[i+3] = (unsigned char) ((ca += cp[i+3]) & 0xff);
}
} else {
cc -= stride;